可能重複:
C++ templates that accept only certain types我們可以只爲某些數據類型定義模板函數嗎?
例如,如果我們想定義,我們可以使用整數模板功能,花車,雙打,但不是字符串。有沒有簡單的方法來做到這一點?
可能重複:
C++ templates that accept only certain types我們可以只爲某些數據類型定義模板函數嗎?
例如,如果我們想定義,我們可以使用整數模板功能,花車,雙打,但不是字符串。有沒有簡單的方法來做到這一點?
以某種形狀或形式使用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_supported
。 std::enable_if
是C++ 2011的一部分,但它很容易實現或從boost中獲得,以防它不適用於您正在使用的標準庫。
通常,由於模板實現通常具有隱式限制,因此通常不需要施加顯式限制。但是,有時禁用或啓用某些類型會有所幫助。
您可以檢查值的類型。如果他們是你指定的類型之一,你可以繼續,否則你可以返回該函數。 在這裏查看更多的信息:http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Fthe_typeid_operator.htm
隨着使用typeid你也應該能夠拋出一個編譯錯誤。
通常將某些類型列入白名單會極大地限制模板的使用。
Boost有所謂的concepts,它們基本上是模板的接口。 而不是將某些類型列入白名單,如果某些條件(函數缺失或錯誤的參數等)未得到滿足,您可以創建編譯時錯誤。當然你也可以使用它來限制你的模板參數爲某些類型。
據我所知,不是在C++甚至是C++ 11中,但是如果我沒有記錯的話,舊的刪除的關於概念的特徵就會做到你想要的。 – Geoffroy 2011-12-29 18:10:52
@Geoffroy:對此沒有核心語言級別的支持,但使用enable_if可以完成(請參閱我的答案)。這可能有點麻煩,但我可以想象一些幫助類型,可以使用可變參數模板在C++ 2011中給出這種更好的語法(但我還沒有嘗試過)。 – 2011-12-29 18:16:49
您是否想要爲支持的類型應用相同的定義,還是需要爲每個定義不同的定義?即'f'與'f '具有完全相同的身體嗎? –
2011-12-29 18:18:14