代码之家  ›  专栏  ›  技术社区  ›  Daniel Langr

显式模板实例化和转发引用

  •  2
  • Daniel Langr  · 技术社区  · 7 年前

    模板的类型限制 使用 转发引用 . 我知道通过 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&) ),但我猜想它是通过模板推导得出的,可能引用了折叠规则。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Petar Velev    7 年前

    这没关系 便携式/标准兼容 .

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

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

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

    std::stringstream .