2012-02-22 73 views
3

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

+1

不要使用宏写'template'线。这很难理解。而且,你的问题是什么?链接中显示的代码是否不相同? – iammilind 2012-02-22 03:45:16

+0

不清楚问题。什么是foo专业化? – 2012-02-22 03:46:10

+0

@ iammilind ::我想问的问题是,假设我想以不同的方式实现MyClass 的函数foo,并且我不想使用专门的Template类(正如我在代码中所做的那样) ,那有可能吗?如果是的话,那么如何实现呢? – Atul 2012-02-22 03:47:59

回答

2

这可以,如果你创建类模板的完全专门来完成。只是参考答案这样一个问题:If I want to specialise just one method in a template, how do I do it?

否则,如果你想拥有具有相同签名给定函数具有取决于类的实例化版本两种不同的行为,并实例化的偏特模板类,你将不得不做一个模板类的专门化。

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

+0

Jason,但是,这似乎不适用于具有多个typenames的模板类。请参考下面的代码http://ideone.com/fpikG – Atul 2012-02-23 04:13:11

+0

在你的例子中不起作用的称为类模板的*部分特化*,并且是我在我的答案中提到的条件工作......你必须为部分专门化的课程创建一个完整的定义。如果您想知道使用什么语法,只需Google或搜索S.O.对于“部分模板专业化”...你会发现大量的信息。 – Jason 2012-02-23 04:25:00

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”的机会。 (需要在此确认)。

UPDATE ::证实,对2点

1

如果你想专注MyClass的<布尔> ::富,它应该是这样的:

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

如果你问的是,

(1)你想有一个功能Foo()这没有按“T采取任何参数和返回 内部voidMyClass

(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 
    ... 
}