2015-05-10 82 views
1

時,我有2個功能:我如何控制哪些函數被調用,使用模板

void func(void* Buf); 
template<class T> void func(T& val); 

我想與數組或一些指針類型的調用會去第一個電話。 雖然調用類型如:int,double,long等 會轉到第二個,這有可能嗎?

現在,所有呼叫都轉到第二個。

回答

3

可以爲Tvoid*創建的func()一個專門的版本:

template<> void func(void*& val) { 
} 

,而不是提供一個模棱兩可的過載。

4

現在,所有呼叫都轉到第二個。

當然不包括void*。這是因爲除了void*之外的每種類型,模板都是更好的匹配。

也將第一個更改爲模板。

template<class T> void func(T*); 

這將是更好的匹配指針和數組。

0

您需要的功能稱爲部分模板專業化。它只適用於課程,所以你需要把你的功能變成這樣的東西:

#include <iostream> 

template <class T> 
struct funct_t 
{ 
    static void exec(T &t) 
    { 
     std::cout << "T &" << std::endl; 
    } 
}; 

template <class T> 
struct funct_t<T *> // specialization for pointer like types 
{ 
    static void exec(T *t) 
    { 
     std::cout << "T *" << std::endl; 
    } 
}; 

template <class T> 
void funct(T t) 
{ 
    funct_t<T>::exec(t); 
} 

int main(int argc, char *argv[]) 
{ 
    int x = 0; 
    int y[2]; 

    funct(x); 
    funct(y); 
    return 0; 
}