显式模板实例化和转发引用
Explicit template instantiation and forwarding references
最近,我和学生讨论了限制使用转发引用的模板类型的可能性。我知道通过is_same
与static_assert
或enable_if
一起比较类型,但我们也讨论了显式模板实例化。
以下示例适用于我 GCC:
F.H:
template <typename T>
void f(T&& param); // declaration
f.cpp:
#include <iostream>
template <typename T>
void f(T&& param) { std::cout << param << std::endl; }
// explicit instantiations:
template void f<int>(int&&);
template void f<int&>(int&);
主.cpp:
#include "f.h"
int main() {
f(1);
// f('1'); // LINKER ERROR
int i = 2;
f(i);
}
我不是显式模板实例化方面的专家,所以我只是想知道这样的解决方案是否可移植/符合标准。(请不要问我用例,我没有。对我来说,这纯粹是一个学术问题。
更新
我也对显式实例化的格式(<int>(int&&)
和<int&>(int&)
)有点困惑,但我想它是通过模板推导和参考折叠规则给出的。
这没关系,它是可移植的/符合标准的。
这称为模板专用化,您可以在此处阅读有关此主题的更多信息
模板专用化是为特定调用编写特定的处理程序。在您的代码中,您有两个专用项。第一个接收一个右值引用(例如像 5 这样的整数文本)并返回一个int
。
第二个接收一个左值引用(例如,int an 类型的变量 b 的值为 5)并返回一个左值引用。
默认情况下,您尝试使用 std::stringstream
打印参数。
相关文章:
- 正在折叠转发引用
- C++ 何时使用常量引用而不是转发引用
- 模板模板参数和转发引用
- 常量转发引用给出错误 C2440:"正在初始化":无法从"常量标准::字符串"转换为"常量标准::字符串 &&"
- 具有右值引用,而不是使用可变参数模板转发引用
- 自定义类型转换运算符在转发引用上调用时不起作用(当对象按值传递时有效)
- 结构化绑定和转发引用是否混合良好?
- 如何声明接受转发引用并返回引用或副本的函数模板
- 间接转发引用
- 为什么调用转发引用构造函数而不是复制构造函数?
- 为什么 std::get 没有一个接受转发引用的签名
- 对 std::Optional 的转发引用构造函数的约束
- 为什么在这种情况下转发引用不起作用?
- 为什么 std::转发是转发引用所必需的
- 将一包转发引用包装成元组
- 涉及在接口中转发引用的重载
- 将转发引用作为lambda捕获传递
- 是否可以在没有类型推断的情况下实现类似转发引用的行为
- 使用确定类型转发引用行为
- 显式模板实例化和转发引用