2014-11-24 44 views
1
#include <iostream> 
using namespace std; 

template<typename T> 
void fun(const T & val) 
{ 
    cout << " T " << endl; 
} 

template<> 
void fun<int>(const int & val) 
{ 
    cout << " specialization same code " << val << endl; 
} 

template<> 
void fun<double>(const double& val) 
{ 
    cout << " specialization same code " << val << endl; 
} 


int main() 
{ 
    fun(1); 
    fun(1.0); 
    fun('c'); 
    return 0; 
} 

問題>有沒有一種方法可以重用函數專業化代碼?例如,假設'int'和'double'特化具有完全相同的實現代碼。有沒有一種方法可以防止代碼重複?如何重用功能專業化代碼?

http://codepad.org/awGYWiWv

謝謝

+2

創建一個函數,並從這兩個專業調用它們。 – 0x499602D2 2014-11-24 20:41:44

+0

你可以調用另一個專業 – 2014-11-24 20:46:38

回答

3

正如意見提出由@ 0x499602D2,創建另一個功能,並確保它被調用只爲intdouble

template<typename T> 
void bar(const T & val) 
{ 
    // Make sure this gets called only for int or double. 
    static_assert(std::is_same<T, int>::value || std::is_same<T, double>::value); 

    // Do useful stuff with val. 
} 

template<> 
void fun<int>(const int & val) 
{ 
    bar(val); 
} 

template<> 
void fun<double>(const double& val) 
{ 
    bar(val); 
} 
1

要重新使用多種類型的同種相同的代碼,你可以(如果你不使用C++ 11或boost::enable_if)與type traits(一個很好的例子是here)使用std::enable_if

如:

template<typename T> 
typename std::enable_if<std::is_floating_point<T>::value, T>::type 
fun(const T& val) 
{ 
    cout << " floating point specialisation " << val << endl; 
} 

(功能這樣的工作只能在C++ 11專業化,但是你可以在舊的C++版本使用的相同目的的結構或類)

0

像這應該給你你想要的重用水平:

#include <iostream> 
#include <type_traits> 

using namespace std; 

// will only compile if T is an arithmetic type 
template<typename T, 
     typename std::enable_if< 
      std::is_arithmetic<T>::value>::type* = nullptr> 
void fun(T val) 
{ 
    cout << "the square is " << val * val << endl; 
} 

int main() 
{ 
    int x = 10; 
    double y = 10; 

    fun(x); 
    fun(y); 

    return 0; 
}