显式模板实例化和转发引用
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&);
main.cpp:
#include "f.h"
int main() {
f(1);
// f('1'); // LINKER ERROR
int i = 2;
f(i);
}
我不是显式模板实例化方面的专家,所以我只是想知道这样的解决方案是否portable/standard-compliant。 (请不要问我用例,我没有。对我来说,这纯粹是一个学术问题。)
更新
我对显式实例化的格式(<int>(int&&)
和<int&>(int&)
)也有点困惑,但我猜它是由模板推导给出的,可能是参考折叠规则。
这还行,就是portable/standard-compliant。
这称为模板专业化,您可以阅读有关此主题的更多信息here
模板专业化正在为特定调用编写特定处理程序。
在您的代码中,您有两个专业。
第一个接收右值引用(例如像 5 这样的整数文字)和 returns 一个 int
.
第二个接收左值引用(例如,int 类型的变量 b 的值为 5)和 returns 左值引用。
在默认情况下,您尝试使用 std::stringstream
打印参数。
最近,我正在与学生讨论使用转发引用 的模板类型限制 的可能性。我知道通过 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&);
main.cpp:
#include "f.h"
int main() {
f(1);
// f('1'); // LINKER ERROR
int i = 2;
f(i);
}
我不是显式模板实例化方面的专家,所以我只是想知道这样的解决方案是否portable/standard-compliant。 (请不要问我用例,我没有。对我来说,这纯粹是一个学术问题。)
更新
我对显式实例化的格式(<int>(int&&)
和<int&>(int&)
)也有点困惑,但我猜它是由模板推导给出的,可能是参考折叠规则。
这还行,就是portable/standard-compliant。
这称为模板专业化,您可以阅读有关此主题的更多信息here
模板专业化正在为特定调用编写特定处理程序。
在您的代码中,您有两个专业。
第一个接收右值引用(例如像 5 这样的整数文字)和 returns 一个 int
.
第二个接收左值引用(例如,int 类型的变量 b 的值为 5)和 returns 左值引用。
在默认情况下,您尝试使用 std::stringstream
打印参数。