Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 根据模板参数选择成员类型?_C++_Templates - Fatal编程技术网

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

C++ 根据模板参数选择成员类型?,c++,templates,C++,Templates,如果我有一个模板类: template<int N> class C{ Something _x; } 模板 C类{ 某物; } 我想根据N的值控制类成员的类型\ux。假设N是0,那么x应该是A型,否则x应该是B型 这可能吗 我不想仅仅将该类型作为模板参数传递,因为可能会违反确定使用哪种类型的规则。例如,我可以执行不正确的C。对于只有几种可能类型的场景,您可以使用 #包括 结构A{}; 结构B{}; 样板 M类{ 公众: std::条件_t_x; }; 这可能吗 对。这

如果我有一个模板类:

template<int N>
class C{
    Something _x;
}
模板
C类{
某物;
}
我想根据
N
的值控制类成员的类型
\ux
。假设N是0,那么x应该是A型,否则x应该是B型

这可能吗


我不想仅仅将该类型作为模板参数传递,因为可能会违反确定使用哪种类型的规则。例如,我可以执行不正确的
C

对于只有几种可能类型的场景,您可以使用

#包括
结构A{};
结构B{};
样板
M类{
公众:
std::条件_t_x;
};
这可能吗

对。这也不太难

template<int N>
class C{
    typename c_member<N>::type _x;
}
模板
C类{
typename c_成员::type x;
}
在哪里

struct A{};
结构B{};
模板结构c_成员
{
使用类型=B;
};
模板结构c_成员
{
使用类型=A;
};

如果愿意,您可以添加更多c_成员的专业化。

有很多方法可以做到这一点。我喜欢重载,因为它允许简单的扩展性

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 {};}
templateusing int\u t=std::integral\u常量;
templatestruct标记{使用type=t;constexpr标记{};
templateusing type=typename标记::type;
结构A{};结构B{};
内联标记某物(int){return{};}
样板
内联标记某物(int){return{};}
现在我们只是:

template<int N>
class M {
public:
  type<decltype(something(int_t<N>{}))> _x;
};
模板
M类{
公众:
x型;
};
唯一的优点是,您可以使用重载解析的全部功能来选择类型,并且不必处理模板专门化,也不必创建一个复杂的条件来覆盖许多情况


如果你用简单的逻辑在两种类型之间进行选择,那就太过分了。

我会用另一种答案来回答这个问题(因为它更简单),但谢谢@用户997112,没问题。
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;
};