2011-12-04 98 views
3

我想創建一個函數模板,其中類T僅限於特殊基類T_base的派生類。什麼是實現這一目標的有效方法?謝謝你的幫助!函數模板的規範

回答

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

採取通知雖然,這些都是C++ 11個功能 – Chris

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&);