2013-12-13 51 views
0

如果我有:如何禁用模板如果沒有提供模板參數?

template< typename T > 
foo(T bar) 
{ 
    // do stuff. 
} 

如何從使用禁用模板,如果有人寫

int bar; 
foo(bar)? 

讓我解釋遠一點:

template< typename T, typename Y > inline void 
destroy(T &t, Y &y) 
{ 
} 

template< typename T, typename Y > inline void 
destroy(T &t, Y &&y) 
{ 
} 

template< typename T > inline void 
destroy(T &t, unsigned long int &y) 
{ 
} 

如果鍵入

destroy< unsigned long int >(something, 10) 

它調用

template< typename T, typename Y > inline void 
    destroy(T &t, Y &&y) 
+3

你是什麼意思「禁用」?如不使用角括號語法?這是類型扣除和正常工作。編譯器將'foo (100)'與'foo(100)'相同。 –

+1

你想迫使人們明確地說foo (酒吧)而不是它的參數暗示? – falstro

+0

@WilliamCustode應該指出的是,這隻適用於* functions *,如果foo是一個'template class foo'的構造函數,那麼你的SOL。 – IdeaHat

回答

5

模板參數可以從函數參數推導出來,所以不需要明確指定。

您可避免通過使扣失敗:

template<typename T> 
struct wrap { typedef T type; }; 

template<typename T> 
void foo(typename wrap<T>::type bar); 

void test() 
{ 
     foo(3);   // fails 
     foo<int>(3); // works 
} 
+0

爲什麼我沒有想到這個?聰明,但非常毫無意義的imo(但在OP上)。 – chris

+0

注意:這是在*不可誘發的情況下播放*對於那些有興趣挖掘:) –

+0

我會將此標記爲賴特答案。儘管如此,這並不是我想看到的。我討厭它決定使用一個模板,當只提供1個模板時需要2個模板參數,而需要1個模板參數的模板可以自由選擇但不是。 – user985611

0

不能從發生停止自動扣除模板,任何比你更可以阻止下雨。

你可以做的是提供做的類型的專門化,希望模板實例化,而不是提供非專業版本的實現。

template< typename T > 
foo(T bar); 

template<> foo <int> (int bar) 
{ 
    // do stuff. 
} 

這將爲int類型,或可轉換爲int類型只提供foo專業化

相關問題