根据模板参数选择成员类型?

时间:2017-04-14 19:57:17

标签: c++ templates

如果我有模板类:

template<int N>
class C{
    Something _x;
}

我想根据_x的值来控制班级成员N的类型。假设如果N为0,那么_x应该是A型,否则_x应该是B型。

这可能吗?

我不想将类型作为模板参数传递,因为可能违反规则来确定要使用的类型。例如,我可能会C<1, A>这是不正确的。

3 个答案:

答案 0 :(得分:4)

对于只有少数可能类型的方案,您可以使用std::conditional

#include <type_traits>

struct A {};
struct B {};

template<int N>
class M {
public:
    std::conditional_t<N == 0, A, B> _x;
};

答案 1 :(得分:3)

  

这可能吗?

是。它也不太难。

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的更多专精。

答案 2 :(得分:0)

有很多方法可以做到这一点。我喜欢做重载,asmit允许轻松扩展。

template<int N>using int_t=std::integral_constant<int,N>;
template<class T>struct tag_t{using type=T; constexpr tag_t(){}};
template<class Tag>using type=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<decltype(something(int_t<N>{}))> _x;
};

唯一的好处就是你可以获得超载分辨率的全部功能来选择类型,而且你不必混淆模板专业化,而且你不必做出一个复杂的条件来涵盖许多例。

如果您使用简单的逻辑在两种类型之间进行选择,则这是过度的。