如果我有一个模板类:
template<int N> class C{ Something _x; }
我想根据N的值来控制类成员_x的类型。假设N为0,则_x应为类型A,否则_x应为类型B。这可能吗?我不想只是把类型作为模板参数传递,因为这可能会违反确定使用哪种类型的规则,例如我可以做C<1, A>,这是不正确的。
N
_x
C<1, A>
byqmnocz1#
对于只有几种可能类型的场景,可以使用std::conditional。
std::conditional
#include <type_traits> struct A {}; struct B {}; template<int N> class M { public: std::conditional_t<N == 0, A, B> _x; };
5vf7fwbs2#
这可能吗?是的。也不是太难。
template<int N> class C{ typename c_member<N>::type _x; }
其中
struct A {}; struct B {}; template <int N> struct c_member { using type = B; }; template <> struct c_member<0> { using type = A; };
如果需要,可以添加更多的c_member专门化。
c_member
1mrurvl13#
有很多方法可以做到这一点。我喜欢重载,因为它允许容易的扩展性。
template<int N>using int_t=std::integral_constant<int,N>; template<class T>struct tag_t{ using type=T; constexpr tag_t()=default; }; template<class Tag> using type_t=typename Tag::type; struct A{}; struct B{}; inline tag_t<A> something(int_t<0>){return {};} template<int x> inline tag_t<B> something(int_t<x>){return {};}
现在我们只是:
template<int N> class M { public: type_t<decltype(something(int_t<N>{}))> _x; };
唯一的优点是你可以利用重载解析的全部功能来选择类型,而且你不需要搞砸模板的特殊化,也不需要创建一个复杂的条件来覆盖很多情况。如果你用简单的逻辑在两种类型之间挑选,这就是矫枉过正了。
3条答案
按热度按时间byqmnocz1#
对于只有几种可能类型的场景,可以使用
std::conditional
。5vf7fwbs2#
这可能吗?
是的。也不是太难。
其中
如果需要,可以添加更多的
c_member
专门化。1mrurvl13#
有很多方法可以做到这一点。我喜欢重载,因为它允许容易的扩展性。
现在我们只是:
唯一的优点是你可以利用重载解析的全部功能来选择类型,而且你不需要搞砸模板的特殊化,也不需要创建一个复杂的条件来覆盖很多情况。
如果你用简单的逻辑在两种类型之间挑选,这就是矫枉过正了。