2011-12-29 129 views
5

可能重複:
C++ templates that accept only certain types我們可以只爲某些數據類型定義模板函數嗎?

例如,如果我們想定義,我們可以使用整數模板功能,花車,雙打,但不是字符串。有沒有簡單的方法來做到這一點?

+0

據我所知,不是在C++甚至是C++ 11中,但是如果我沒有記錯的話,舊的刪除的關於概念的特徵就會做到你想要的。 – Geoffroy 2011-12-29 18:10:52

+0

@Geoffroy:對此沒有核心語言級別的支持,但使用enable_if可以完成(請參閱我的答案)。這可能有點麻煩,但我可以想象一些幫助類型,可以使用可變參數模板在C++ 2011中給出這種更好的語法(但我還沒有嘗試過)。 – 2011-12-29 18:16:49

+0

您是否想要爲支持的類型應用相同的定義,還是需要爲每個定義不同的定義?即'f '與'f '具有完全相同的身體嗎? – 2011-12-29 18:18:14

回答

8

以某種形狀或形式使用std::enable_if的方法。然後將支持類型的選擇器用作返回類型。例如:

template <typename T> struct is_supported { enum { value = false }; }; 
    template <> struct is_supported<int> { enum { value = true }; }; 
    template <> struct is_supported<float> { enum { value = true }; }; 
    template <> struct is_supported<double> { enum { value = true }; }; 

    template <typename T> 
    typename std::enable_if<is_supported<T>::value, T>::type 
    restricted_template(T const& value) { 
    return value; 
    } 

顯然,你想給的特點一個更好的名字比is_supportedstd::enable_if是C++ 2011的一部分,但它很容易實現或從boost中獲得,以防它不適用於您正在使用的標準庫。

通常,由於模板實現通常具有隱式限制,因此通常不需要施加顯式限制。但是,有時禁用或啓用某些類型會有所幫助。

0

通常將某些類型列入白名單會極大地限制模板的使用。

Boost有所謂的concepts,它們基本上是模板的接口。 而不是將某些類型列入白名單,如果某些條件(函數缺失或錯誤的參數等)未得到滿足,您可以創建編譯時錯誤。當然你也可以使用它來限制你的模板參數爲某些類型。

相關問題