我想創建一個函數模板,其中類T僅限於特殊基類T_base的派生類。什麼是實現這一目標的有效方法?謝謝你的幫助!函數模板的規範
Q
函數模板的規範
3
A
回答
7
您可以使用類型特徵和SFINAE
template<typename T,
bool[std::is_base_of<T_base, T>::value] = nullptr>
void f(T const&);
C++ 03的版本,也適用於C++ 11
template<typename T>
typename boost::enable_if< boost::is_base_of<T_base, T> >::type
f(T const&);
有移動enable_if
的C++ 11版到模板參數列表,使用默認參數
template<typename T,
typename = typename std::enable_if<
std::is_base_of<T_base, T>::value>::type>
void f(T const&);
可悲的是你再不能超載f
如果其他重載的唯一區別是SFINAE字符串(即默認參數),因爲默認參數不是函數模板簽名的一部分。但模板參數的類型本身就是(這些規則就像正常的函數參數一樣)。
0
我能想到的最簡單的方法是這樣的:
template<class T>
void someFunc(T arg)
{
dynamic_cast<BaseClass>(arg); // will throw an exception if not castable to base class
// continue...
}
+0
約翰內斯解決方案是更好;) – Chris
1
的C++ 0x具有std::enable_if
;如果你的編譯器還不支持它,那麼就有boost::enable_if
。
例如,如果簽名是template<typename T> int f(T&)
,你會使用
template<typename T>
std::enable_if<std::is_base_of<T_base, T>::value, int>::type f(T&);
相關問題
- 1. 模板規範
- 2. C++,模板模板規範
- 3. 模板參數的格式規範
- 4. 異常規範和模板
- 5. 簡化模板類規範
- 6. 模板規範問題
- 7. 怪異模板規範
- 8. 顯式模板參數規範
- 9. 規範jsPlumb.on()函數
- 10. 模板頁面的規範鏈接
- 11. 作爲模板函數的模板參數的模板函數
- 12. C++中的部分模板函數規範可行,但爲什麼?
- 13. C++模板:部分模板規範和朋友類
- 14. D中的模板實例化理解模板,模板混合模板,模板函數和範圍
- 15. 類模板+函數模板
- 16. 模板模板C++函數
- 17. 實體框架 - 規範函數與Linq不同 - Linq-to-Entities與規範函數
- 18. 規範模式與規範在BDD
- 19. 函數模板
- 20. 重載函數的C++異常規範
- 21. 謂詞函數的Clojure規範
- 22. JavaScript中的函數調用模式範圍規則
- 23. 規範模式修改(構造函數中的候選人)
- 24. 非模板類中的函數模板
- 25. 導出模板類的模板函數
- 26. 模板類中的模板函數
- 27. 模板類中的模板函數is_same
- 28. 接受模板類的模板函數
- 29. 模板類的專用模板函數
- 30. 模板函數採用模板參數
採取通知雖然,這些都是C++ 11個功能 – Chris