没有名称的C++模板参数
C++ template argument without a name
我遇到了以下代码片段:
template <typename T, typename = void>
struct test {
int t = sizeof(T);
};
我知道在typename = void
中,void是默认参数,但它没有名称!它对什么有用?它到底意味着什么?
这与SFINAE一起用于专业化。这样做可以让你拥有类似的代码
template <typename T, typename = void>
struct test {
int t = sizeof(T);
};
template <typename T>
struct test<T, std::enable_if_t<std::is_integral_v<T>>> {
// ^^ this part "fills in" the void ^^
int t = 42;
};
template <typename T>
struct test<T, std::enable_if_t<std::is_floating_point_v<T>>> {
// ^^ this part "fills in" the void ^^
int t = 21;
};
int main()
{
test<int> i;
std::cout << i.t << "n";
test<double> d;
std::cout << d.t;
}
输出
42
21
如果没有typename = void
,我们将无法添加这些专业化,因为enable_if_t
部分将无法"填充"第二个参数。
我个人喜欢将其视为默认模板(类型(参数的情况,以排除不符合某些标准的重载。首先,为默认模板参数命名是很好的,所以以下内容是正确的:
template <typename T, typename sometype= void>
struct test {
int t = sizeof(T);
};
在上面的例子中,类型参数sometype
显然没有在结构测试中的任何地方使用。但是,如果我们不将默认值设置为void,而是使用一些编译时条件将其设置为模板函数仅对这样的积分类型有效,该怎么办?
(借用nathan答案中的代码(
template <typename T>
struct test<T, typename sometype = std::enable_if_t<std::is_integral_v<T>>> {
int t = 42;
};
如果T的类型为integral
,则定义sometype,否则使用sfinae忽略给定的模板。
此外,您可以将";CCD_ 6";写入:
template <typename T>
struct test<T, typename = std::enable_if_t<std::is_integral_v<T>>> {
int t = 42;
};
最后将其与函数声明中使用的默认值进行比较:
void foo(int = 9); //Function declaration can have default values without names too.
void foo (int a )
{
//some code
}
除了其他人的聪明答案来描述初始问题使用传统的模板元编程的SFINAE规则,
我可以补充一点,我们现在可以通过名为<概念>头,它支持约束——给定模板类型和模板值的条件或子情况。
更多信息,请访问https://en.cppreference.com/w/cpp/language/constraints
相关文章:
- 如何反转整数参数包
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 函数调用中参数的顺序重要吗
- 部分定义/别名模板模板参数
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 使用不带参数的函数访问结构元素
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 如何使用Luacneneneba API正确读取字符串和表参数
- 在派生函数中指定void*参数
- 视图中的参数推导失败:take_while
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- 使用指向成员的指针将成员函数作为参数传递
- 没有名称的C++模板参数
- 如何将enable-if与模板参数和参数包一起使用