2014-10-03 42 views
1

我甚至不確定這是叫什麼。如何將覆蓋傳遞給結構模板類型或變量模板類型到函數中?

我希望做類似這樣的事情......有一個函數將arg引用爲帶有兩個模板的模板類型,但其中一個模板未設置爲石頭。

我的問題是我用什麼來代替WHAT_DO_I_PUT_HERE來得到這個編譯?我已經嘗試過各種東西,比如傳遞void和「struct Hash」(第二個模板聲明爲class Hash = hash<Value>

注意:我不能使用C++ 11。

void doTest(std::tr1::unordered_set<std::string, WHAT_DO_I_PUT_HERE> &set) { 
    ... 
} 

struct HashStructOne { 
    size_t operator()(const std::string &item) const {...} 
}; 

struct HashStructTwo { 
    size_t operator()(const std::string &item) const {...} 
}; 

int main() { 
    std::tr1::unordered_set<std::string, HashStructOne> set1; 
    std::tr1::unordered_set<std::string, HashStructTwo> set2; 
    doTest(set1); 
    doTest(set2); 
} 
+0

宏'HashStructOne'和'HashStructTwo'是兩種截然不同的類型。我不認爲有什麼方法可以在不使用模板或虛函數的情況下對兩種不同類型或成員函數使用相同的函數。 – Jason 2014-10-03 16:36:59

回答

3

你可以做到以下幾點:

template<typename PUT_SOMETHING_HERE> 
void doTest(std::tr1::unordered_set<std::string, PUT_SOMETHING_HERE> &set) { 
     ... 
    } 

模板參數的名稱不一定是任何特殊,它只是將名稱中的函數的參數,其中的模板匹配你想要這個類型被替換。

+0

當嘗試使用基於以下方法調用集合時會導致編譯器錯誤:HashStructOne:error:無法調用「doTest」的匹配函數(std :: tr1 :: unordered_set ,std :: allocator >,HashStructOne,std :: equal_to ,std :: allocator >>,std :: allocator ,std :: allocator >>,false>(&)())' – marathon 2014-10-03 16:51:09

+0

你使用的是哪個版本的編譯器?只是好奇,因爲你仍然在使用'tr1'命名空間... – Jason 2014-10-03 19:30:56

+0

g ++(GCC)4.1.2 20080704(Red Hat 4.1.2-50)...可悲的是我不能走得更新。 – marathon 2014-10-03 19:56:14

2

void doTest(std::tr1::unordered_set<std::string, WHAT_DO_I_PUT_HERE> &set) { 
    ... 
} 

&hellip的最簡單的解決方案;只是

template< class Foo > 
void doTest(std::tr1::unordered_set<std::string, Foo>& set) 
{ 
    ... 
} 

我發現是有用的也傳遞類型的測試功能(輸出)的名稱,因爲從typeid(T).name()名稱不能保證可讀的,特別是與G ++。

然後我這樣定義

#define DO_TEST(Type) test<Type>(#Type) 
相關問題