具有非类型模板参数的构造方法

ale*_*in0 2 c++ templates language-lawyer c++17

这个问题中,它表明不可能直接使用模板参数用于类构造函数,因为如果你写了类似的东西

struct S{
    template<typename T>
    S() { ... }
}
Run Code Online (Sandbox Code Playgroud)

然后你无法调用这个构造函数.但是,有一些解决方法可以使这项工作,例如,通过模板参数推导.

但我所知道的所有这些变通办法都只适用于类型参数.所以,问题是

是否有任何变通方法可以使这种方法适用于非类型模板参数?

struct S{
    template<int x>
    S() { ... }
}
Run Code Online (Sandbox Code Playgroud)

我对能够在现代C++(C++ 17标准,包括所有TS)中工作的解决方案感兴趣,因为这是一个理论而非实际的问题.

Bar*_*rry 6

但我所知道的所有这些变通办法都只适用于类型参数

没有一种解决方法是特定于类型的 - 重点是在构造函数中粘贴一些可以推导出来的东西.所以如果我们想要一个类型,我们会做类似的事情:

template <class T> struct tag { };

struct S {
    template <class T>
    S(tag<T>);
};
Run Code Online (Sandbox Code Playgroud)

如果我们想要一个int,我们做同样的事情:

template <int I> struct val { };

struct S {
    template <int I>
    S(val<I>);
};
Run Code Online (Sandbox Code Playgroud)

对于价值观,你甚至不需要提出自己的标签类型 - 你可以在上面捎带std::integral_constant.