繁体   English   中英

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

[英]Specialized function in non specialised Template class

请参考以下代码
非专业模板类中的专用函数
对于非专业模板类MyClass [行号7],是否可以编写专用函数foo? 如果是,那么,相同的语法是什么。
问候,
阿图尔

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

#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”的类的机会。 (需要对此进行确认)。

UPDATE ::在第2点确认。

如果您创建类模板的完全特化,则可以执行此操作。 只需参考这个问题的答案: 如果我想在模板中专门使用一种方法,我该怎么做?

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

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

如果你想专门化MyClass <bool> :: Foo,它看起来像这样:

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

如果你问这个,

(1)你想要一个函数Foo() ,它不接受任何参数并在MyClass返回void

(2)当模板类型为bool ,此Foo()应该是MyClass独有的,即仅适用于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
  ...
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM