如何根据模板参数是否具有别名来专门化类型
How to specialize a type based on whether a template parameter has an alias
我希望能够根据容器是否具有指定的类型定义来专门化类型,例如
class SomethingElse {};
class Something {
using Type = int;
};
static constexpr bool value = ChooseIfType<Something>::value;
当类型没有类型定义Type
时,ChooseIfType
是否有方法返回false ?
我觉得有一种简单的方法可以做到这一点,但是我想不出来。
谢谢!
使用std::void_t
(或c++ 11替代):
template<typename T, typename = std::void_t<>>
struct ChooseIfType : std::false_type {};
template<typename T>
struct ChooseIfType<T, std::void_t<typename T::Type>> : std::true_type {};
现场演示
该方案利用了SFINAE。默认值永远不会是畸形的,并且会创建一个值为false的trait。编译器尝试匹配所有模板特化(在本例中只有一个)。如果T
有一个成员类型Type
,那么ChooseIfType<T, void_t<typename T::Type>>
比ChooseIfType<T, void_t<>>
更专门化。如果没有,那么它就不是一个可行的专门化,并选择默认值,但是替代失败不是错误。
根据cppreference, c++ 11 void_t
的实现看起来像这样:
template<typename... Ts> struct make_void { typedef void type;};
template<typename... Ts> using void_t = typename make_void<Ts...>::type;
相关文章:
- 部分定义/别名模板模板参数
- 如何在C++20中创建模板别名的推导指南
- 是否可以对零模板参数进行模板专门化
- 告诉c++编译器该参数没有别名
- boost::spirit::karma 替代生成器,带有 boost::variant 由字符串和字符串别名组成
- 继承模板类中的类型别名
- 尝试根据类中 typedef 的存在来专门化模板函数
- 别名模板的专业化 C++11 中没有开销的最佳替代方案
- 为什么 GCC 在使用类型别名时处理 const reinterpret_cast不同?
- 类作用域的类型别名"using":[何时]方法中的用法可以先于类型别名?
- 如何基于模板化类的基类专门化成员函数
- 为什么我们不能重复使用具有不同模板参数的别名模板标识符?
- C++模板/别名 - 模板参数列表中参数 1 处的类型/值不匹配
- 如何使用类型别名从模板化类中隐藏模板列表
- C++11`using`关键字:专门化模板参数的模板别名
- 模板化别名声明的部分专门化
- 如何根据模板参数是否具有别名来专门化类型
- 我可以用别名模板专门化一个类模板吗?
- 模板别名、模板专门化和模板参数
- 别名模板专门化