如何在构造函数中指定不可推导的模板形参
How can I specify non-deducible template parameters on a constructor?
可以为模板化的构造函数提供无法推导的模板参数:
struct X
{
int i;
template<int N>
X() : i(N)
{
}
};
如何使用这样的构造函数?你会用它吗?
不,不能指定构造函数模板参数。有几个选择。
- 正如@KerrekSB在注释中指出的,你可以给构造函数模板一个
std::integral_constant
参数,当它作为参数传递时,将推断出N
:
#include <cassert>
#include <type_traits>
struct X
{
int i;
template<int N>
X(std::integral_constant<int, N>) : i(N)
{
}
};
int main()
{
std::integral_constant<int, 6> six;
X x(six);
assert(x.i == 6);
}
<<p> 生活例子/strong> - 您可以编写一个专用的
make_X<N>
模板包装器来隐藏integral_constant
锅炉板: 代码:
template<int N>
X make_X()
{
return X(std::integral_constant<int, N>{});
}
int main()
{
auto y = make_X<42>();
assert(y.i == 42);
}
<<p> 生活例子/strong> 相关文章:
- 哪个模板形参在boost::shared_ptr构造函数中使用一个原始指针
- 指向函数的指针vs作为模板非类型形参的函数
- 如何在构造函数中指定不可推导的模板形参
- 定义一个以std::数组为形参的函数
- c++ 11的构造函数中的花括号形参是什么?
- NULL直接传递给需要const引用形参的函数(vc++ 4.2)
- 将函数输出直接传递给接受引用形参的函数
- 带有char**形参的c++函数
- 为什么这样调用构造函数时模板形参推导失败?
- 模板化形参的函数指针歧义
- 传递给构造函数的形参不是类型
- 启用基于类模板形参的构造函数时,是否总是需要复制该类模板形参?
- 从c++ 17开始,构造函数的模板形参推导是否允许显式指定一些类模板实参?
- 使用可变模板形参的构造函数和函数
- c++:当使用结果作为成员函数的形参时,关于转换构造函数的混淆
- 可以基于引用形参类型重载构造函数吗?
- 通过boost::thread传递const指针形参给函数
- 从构造函数中的成员变量推导出模板形参
- 在不调用initializer_list构造函数的情况下,将不可复制、不可移动的类型构造为函数形参
- 模板类复制构造函数形参,带或不带模板实参