1

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

4

1 回答 1

1

这没关系,它是可移植的/符合标准的

这称为模板专业化,您可以在此处阅读有关此主题的更多信息

模板专业化是为特定的调用编写特定的处理程序。在您的代码中,您有两个专长。第一个接收一个右值引用(例如像 5 的整数文字)并返回一个int.

第二个接收一个左值引用(例如,int 类型的变量 b 的值为 5)并返回一个左值引用。

在默认情况下,您尝试使用std::stringstream.

于 2017-10-09T08:32:43.793 回答