最近,我正在和学生讨论使用转发引用的模板限制类型的可能性。我知道用or来比较类型,但我们也谈到了显式模板实例化。is_same
static_assert
enable_if
以下示例适用于 GCC:
fh:
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&)
)的格式也有点困惑,但我猜它是由模板推导给出的,可能是引用折叠规则。