【问题标题】:Function template explicit specialization c++函数模板显式特化 c++
【发布时间】:2013-04-16 13:51:14
【问题描述】:

我的书提到了两种显式专业化的方法:

template <> void Swap<int> (int &, int &);
template <> void Swap(int &, int&);

两者有什么区别?什么时候用一个,什么时候用另一个?函数名后面的到底是什么?

【问题讨论】:

    标签: c++ templates specialization explicit


    【解决方案1】:

    两者有什么区别?

    没有区别

    在第二种情况下,您让编译器从特化的签名中执行类型推导。因此,两种形式都声明了 Swap&lt;T&gt;() 的特化 T = int

    什么时候用一个,什么时候用另一个?

    由您自行决定,当一种或另一种在可读性或易维护性方面满足您的要求时。

    函数名后面的到底是什么?

    在函数名之后,就是指定模板参数的语法:

    template<typename T = double, typename U = char>
    void foo();
    
    foo<int, bool>(); // Specifies explicit template arguments
    foo<>(); // Use default template arguments
    foo(); // Same as above, allowed for *function* templates only
    

    当它出现在template关键字之后时,它是用于引入(类或函数)模板特化的语法。

    【讨论】:

    • 如果...template &lt;&gt; void Swap( int a, char b)?
    • @xgbi: 类型推断失败
    • @xgbi 我想这个函数定义了一些类似 Swap(T&, T&) 的东西,所以你可能无法写出来。
    • 假设我们有一个模板,它接受两个变量 Type1 t 和 Type2 u 作为参数。当只有一个参数是特定的时,是否可以定义明确的专业化?例如:当 t 是 int 时,u 可以是任何东西。有可能吗?
    • @jazzybazz:不,函数模板不能部分特化。但是您可以创建两个 重载(一个带有两个模板参数,一个带有一个模板参数)。
    【解决方案2】:

    第一个示例是显式特化模板的真正方法,第二个示例只是第一种方法的快捷方式,因为编译器可以从函数签名中推断出类型本身。 结果是一样的,没有真正的区别。

    &lt;&gt;用于将模板参数赋予模板化结构,在这种情况下,模板参数是被操作数据的类型,特化是int类型。

    【讨论】:

      猜你喜欢
      • 2013-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-07
      • 2010-11-27
      • 2019-04-15
      • 2021-12-28
      • 1970-01-01
      相关资源
      最近更新 更多