【发布时间】:2019-09-24 09:52:08
【问题描述】:
我尝试创建无法与原始模板区别的模板别名。
所以,我创建了特征来检查 2 个模板(不是类型)何时相等:
template <template <class...> class C1,
template <class...> class C2>
struct is_same_template : std::false_type {};
template <template <class...> class C1>
struct is_same_template<C1, C1> : std::true_type {};
现在测试一下:
// Expected alias
template <typename ... Ts> using V_Ts = std::vector<Ts...>; // Variadic
// Fallback alias
template <typename T, typename A> using V = std::vector<T, A>; // Exact count
static_assert(!is_same_template<std::vector, V_Ts>::value); // Alias rejected by gcc/clang
static_assert( is_same_template<std::vector, V>::value); // Alias accepted only for gcc
是否可以创建“真实”别名? 哪个编译器是对的?
【问题讨论】:
-
"哪个编译器是对的?"你用的是什么编译器?
-
两条静态断言行上的 cmets 与我在 gcc.godbolt 演示中看到的不匹配。一方面,在demo中这两行颠倒了,
static_assert(!is_same_template<std::vector, V_Ts>::value);这行被gcc 8.3和clang 8.0.0都接受了。那条线还有其他我没有看到的问题吗? -
@DavidDalcino:断言通过,所以模板不同,所以别名被“拒绝”。
-
应该有更多的解释,你做了什么,你使用了哪些工具......
标签: c++ language-lawyer template-templates using-declaration