模板别名的平等
Equality of template aliases
本文关键字:别名 更新时间:2023-10-16
我尝试创建无法区分的模板别名。
所以,我创建特征以检查何时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
演示
是否可以创建"真"别名?哪个编译器是对的?
我尝试创建模板别名,该模板是无法区分的。
我认为目前不可能。(不幸的是(没有模板别名,只有别名模板。别名模板始终是其自己的[temp.alias]/1的模板。别名模板的专业化相当于通过将模板参数替换为别名模板而获得的类型,但是别名模板本身并不是另一个模板[temp.alias]/2的别名。我会考虑GCC让您的第二个static_assert
通过GCC&Hellip;
@holyblackcat在上面的评论中指出,有一个相关的问题和答案指出了许多相关的CWG问题。特别是一个问题(CWG 1286(似乎表明,愿意允许别名模板本身与在某些情况下所指的模板相同。但是,由于稍后提出的担忧,似乎并没有采用拟议的决议。当前标准草稿中的相关措辞([temp.alias]和[temp.type](似乎从C 11…
相关文章:
- 部分定义/别名模板模板参数
- 如何在C++20中创建模板别名的推导指南
- 告诉c++编译器该参数没有别名
- boost::spirit::karma 替代生成器,带有 boost::variant 由字符串和字符串别名组成
- 继承模板类中的类型别名
- 别名模板的专业化 C++11 中没有开销的最佳替代方案
- 为什么 GCC 在使用类型别名时处理 const reinterpret_cast不同?
- 类作用域的类型别名"using":[何时]方法中的用法可以先于类型别名?
- 为什么我们不能重复使用具有不同模板参数的别名模板标识符?
- C++模板/别名 - 模板参数列表中参数 1 处的类型/值不匹配
- 如何使用类型别名从模板化类中隐藏模板列表
- 模板模板参数和模板别名:编译器错误?
- 使用定义函数模板别名
- 为模板参数包添加别名
- 如何检测类型类型别名?
- C++类型别名,其中值被替换
- C++使用默认模板参数键入别名和转发声明
- 在Qt中注册自定义元类型的别名类型
- 缺少别名模板C++参数列表
- 使用外部定义的模板类型作为模板参数的更通用模板的模板别名