非专业模板类中的专用函数

时间:2012-02-22 03:37:26

标签: c++ templates

请参阅以下代码
 Specialized function in non specialized Template class
对于非专业模板类MyClass [行号7],是否可以编写专用函数foo?如果是,那么,同样的语法是什么 问候,
阿图尔

4 个答案:

答案 0 :(得分:2)

请看下面的示例,我尝试用最简单的代码回答您的问题(如果我猜对了):

#include <iostream>

using namespace std;

template<typename T>
class Some
{
public:
    template<typename U> void foo(U val);
};

template<typename T>
template<typename U>
void Some<T>::foo(U val)
{
    cout << "Non specialized" << endl;
}

template<>
template<>
void Some<char>::foo(char val)
{
    cout << "Char specialized" << endl;
}

int main()
{
    Some<int> t1;
    t1.foo(5);

    Some<char> t2;
    t2.foo('c');

    return 0;
}
  1. 这里要注意的重要一点是“你不能专门化你的课程和独立的功能”,即你必须在示例中同时专注于两者。

  2. 此外,在这种情况下,您将失去专门针对该数据类型“char”的类的机会。 (需要对此进行确认)。

  3. 更新 ::在第2点确认。

答案 1 :(得分:2)

如果您创建类模板的完全特化,则可以执行此操作。请参阅此问题中的答案:If I want to specialise just one method in a template, how do I do it?

否则,如果您希望具有相同签名的给定函数具有两种不同的行为,具体取决于类的实例化版本,并且该实例化是模板类的部分特化,您将必须对模板类进行单独的专门化。

请记住,如果您想在第二种情况下避免冗余代码,您始终可以创建一个基本模板类,该类具有不会更改的功能,然后创建将包含必要的唯一功能的派生模板类对于每个部分专业化。

答案 2 :(得分:1)

如果你想专门化MyClass&lt; bool&gt; :: Foo,它看起来像这样:

template <>
void MyClass<bool>::Foo(bool A)
{
  // code goes here
}

答案 3 :(得分:1)

如果你这么想,

(1)你想要一个不带任何参数的函数Foo()     在void

中返回MyClass

(2)当Foo()时,MyClass应该是bool独有的     模板类型为MyClass<bool>,即仅适用于template<class Precision> class MyClass { ... public: ... void Foo (); // don't implement here }; ... template<> void MyClass<bool>::Foo () // implementing only for 'MyClass<bool>' { // invoking for other 'MyClass<>' will result in compiler error ... }

然后就是这样:

{{1}}