如何根据模板参数是否具有别名来专门化类型

时间:2016-10-27 02:59:13

标签: c++ c++11 c++14 template-specialization

我希望能够根据容器是否具有指定的typedef来专门化类型,例如

class SomethingElse {};
class Something {
    using Type = int;
};

static constexpr bool value = ChooseIfType<Something>::value;

当类型没有typedef ChooseIfType时,Type是否有办法返回false?

我觉得有一种简单的方法可以做到这一点,但我无法理解。

谢谢!

1 个答案:

答案 0 :(得分:2)

只需使用std::void_t(或C ++ 11替代方案):

T

live demo

该解决方案使用SFINAE。默认值永远不会格式错误,并创建值为false的特征。编译器尝试匹配所有模板特化(在这种情况下只有一个)。如果Type的成员类型为ChooseIfType<T, void_t<typename T::Type>>,则ChooseIfType<T, void_t<>>void_t更专业。如果没有,那么它不是一个可行的专业化,并且选择了默认值,但是替换失败不是错误。

根据cppreference,C ++ 11 template<typename... Ts> struct make_void { typedef void type;}; template<typename... Ts> using void_t = typename make_void<Ts...>::type; 实现可能如下所示:

int k = 0;
counter[k++];