2012-10-15 26 views
1

如何專門化或重載函數func以便專業化處理MyClass的所有實例?假設func是一個圖書管理員功能(例如std::swap),所以我不能更改func,我不能替換或包裝它,我必須專門化它。如何爲模板類的所有實例專門化或重載全局模板函數?

#include <iostream> 

template<typename T> 
class MyClass 
{ 
}; 

template<typename T> 
void func(const T&) 
{ 
    std::cout << "Default" << std::endl; 
} 

// I don't want to copy this stuff for every instance of MyClass 
template<> 
void func<MyClass<int>>(const MyClass<int>&) 
{ 
    std::cout << "Specialization" << std::endl; 
} 

int main(int, char**) 
{ 
    func(int(0)); // "Default" 

    func(MyClass<int>()); // "Specialization" 

    func(MyClass<double>()); // "Default" but I want "Specialization" here 

    return 0; 
} 
+0

你不能重載嗎? – avakar

+0

是的。這是解決方案。謝謝。 – tim

回答

2

這裏有幾個你可以做的例子。

template<typename T> 
void func(const T&) 
{ 
    std::cout << "Default" << std::endl; 
} 

template<template<typename> class A , typename B> 
void func(const A<B>&) 
{ 
    std::cout << "Overload All templated classes with one templated argument B" << std::endl; 
} 

template<typename T> 
void func(const MyClass<T>&) 
{ 
    std::cout << "Overload Myclass with some templated argument T" << std::endl; 
} 
+0

+1這似乎是一個很好的答案。 – iammilind

+0

是啊!非常感謝你!這樣可行。 – tim

+1

這些不是專業化。這些都是重載。而且您不需要「默認模板化功能」即可實現此功能。檢查http://www.gotw.ca/publications/mill17.htm瞭解差異。 – Tomek

0

如果你不能改變反正全球func,但還是要避免複製一個方法是使用宏來爲你自動完成repeatative東西。

#define Specialize(TYPE) \ 
template<> \ 
void func<MyClass<TYPE>>(const MyClass<TYPE>&) \ 
{ \ 
    std::cout << "Specialization" << std::endl; \ 
} 

Specialize(int); 
Specialize(double); 

如果你有自由改變MyClass<T>,然後將的MyClass<T>所有常用功能集成到一個普通的非模板基類:

template<typename T> 
class MyClass<T> : public MyClassBase // <---- a common base class 
... 

,只需重載或只爲MyClassBase專門func()

void func(const MyClassBase&) 
{ 
    std::cout << "Specialization" << std::endl; 
}