【问题标题】:Explicit template instantiation and forwarding references显式模板实例化和转发引用
【发布时间】:2017-10-09 08:13:14
【问题描述】:

最近,我正在与学生讨论模板类型限制使用转发引用的可能性。我知道通过is_samestatic_assertenable_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&);

ma​​in.cpp:

#include "f.h"      

int main() { 
   f(1);              
// f('1'); // LINKER ERROR   

   int i = 2;         
   f(i);              
}                     

我不是显式模板实例化方面的专家,所以我只是想知道这样的解决方案是否可移植/符合标准。 (请不要问我用例,我没有。对我来说,这纯粹是一个学术问题。

更新

我对显式实例化的格式(&lt;int&gt;(int&amp;&amp;)&lt;int&amp;&gt;(int&amp;))也有些困惑,但我猜它是由模板推导给出的,可能是引用折叠规则。

【问题讨论】:

    标签: c++ templates explicit-instantiation forwarding-reference


    【解决方案1】:

    没关系,它便携/符合标准

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

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

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

    在默认情况下,您尝试使用 std::stringstream 打印参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-25
      • 1970-01-01
      • 1970-01-01
      • 2021-05-02
      • 2021-07-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多