【发布时间】:2017-04-04 15:37:23
【问题描述】:
在this question 中,声明不能直接为类构造函数使用模板参数,因为如果你写类似
struct S{
template<typename T>
S() { ... }
}
那么你就没有办法调用这个构造函数了。但是,有一些变通方法可以使这项工作发挥作用,例如,通过模板参数推导。
但我知道的所有这些变通方法都只适用于类型参数。那么问题来了
是否有任何变通方法可以使该方法适用于非类型模板参数?
struct S{
template<int x>
S() { ... }
}
我对适用于现代 C++(C++17 标准,包括所有 TS)的解决方案感兴趣,因为这是一个理论问题,而不是实际问题。
【问题讨论】:
-
在给定适当的参数列表的情况下,非类型模板参数总是可以推导出来的。在给定数组时,
std::size_t参数经常发生这种情况。 Yakk 的tag答案同样适用。 -
你可以有
template<int x> S(std::integral_constant<int, x>); -
不确定我理解你的意思。您能否以答案的形式写得更详细一点?
-
虽然接受的答案为您的问题提供了技术上正确的解决方案,但我看不出使用
S s(val<5>{});比使用S s<5>{};更好。
标签: c++ templates language-lawyer c++17