在this question中,它声明直接使用模板参数作为类构造函数是不可能的,因为如果你写了像
这样的东西struct S{
template<typename T>
S() { ... }
}
然后你无法调用这个构造函数。但是,有一些解决方法可以使这项工作,例如,通过模板参数推断。
但我知道的所有这些变通方法仅适用于类型参数。所以,问题是
是否有任何变通方法可以使其适用于非类型模板参数?
struct S{
template<int x>
S() { ... }
}
我对能够在现代C ++(C ++ 17标准,包括所有TS)中工作的解决方案感兴趣,因为这是一个理论而非实际的问题。
答案 0 :(得分:5)
但我知道的所有这些变通方法仅适用于类型参数
没有一种解决方法是特定于类型的 - 关键是在构造函数中粘贴一些可以推导出来的东西。因此,如果我们想要一个类型,我们会做类似的事情:
template <class T> struct tag { };
struct S {
template <class T>
S(tag<T>);
};
如果我们想要int
,我们会做同样的事情:
template <int I> struct val { };
struct S {
template <int I>
S(val<I>);
};
对于值,您甚至不需要提供自己的标记类型 - 您可以在std::integral_constant
之上进行背包打包。