我希望能够根据容器是否具有指定的typedef来专门化类型,例如
class SomethingElse {};
class Something {
using Type = int;
};
static constexpr bool value = ChooseIfType<Something>::value;
当类型没有typedef ChooseIfType
时,Type
是否有办法返回false?
我觉得有一种简单的方法可以做到这一点,但我无法理解。
谢谢!
答案 0 :(得分:2)
只需使用std::void_t
(或C ++ 11替代方案):
T
该解决方案使用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++];