2015-05-19 57 views
0

在下面的代碼中,我試圖檢查作爲第二個模板參數傳遞給WTrajectory的類的簽名。在當前實現中,WTrajectory的構造函數將模板參數T的類型與作爲第二個參數傳遞給它的類型的模板參數進行比較。C++如何在編譯時檢查模板參數類的簽名

當前實現可以執行檢查。但是,如果可能的話,我寧願在編譯時執行它。此外,我還想檢查模板參數TWPoint是否有編譯時的成員函數returnTimeTypeID(在運行時執行此檢查的解決方案可以在此處找到:link)。

template<typename T> 
struct WPoint 
{ 
    const std::type_info& returnTimeTypeID(void) const 
     {return typeid(T);} 
}; 

template<typename T, typename TWPoint> 
struct WTrajectory 
{ 
    WTrajectory(const TWPoint& wp) 
     { 
      compare_types(wp); 
     } 

    void compare_types(const TWPoint& wp) 
     { 
      if (typeid(T) != wp.returnTimeTypeID()) 
       throw std::runtime_error("Error"); 
     } 
}; 
+0

你想要檢查什麼?措辭使得你似乎只是想檢查'TWPoint'是'WPoint '? – Barry

回答

1

由於returnTimeTypeID是非虛擬編譯器將知道在編譯時的動態類型的TWPoint。因此,而不是做一個運行時檢查只需要改變你的模板:

template<typename T> 
struct WTrajectory 
{ 
    typedef T TWPoint; 
    ... 

最好的方式來檢查模板類型是否具有在編譯時perticular方法是只要調用方法。如果它不提供所需的功能,您將收到編譯錯誤。

+0

我不認爲我用最好的方式表達了這個問題。通常,我的目標是爲每種類型的錯誤提供特定的錯誤消息。但是,我決定在問題結束時遵循建議,並繼續使用原始的「運行時」解決方案。 – user1391279

0

如果WPoint包含的不僅僅是類型信息越多,那麼下面的代碼將工作

template<typename T> 
struct WPoint 
{ 
    // ... stuff not related to type checking 
}; 

template<typename T> 
struct WTrajectory 
{ 
    WTrajectory(const WPoint<T>& wp) 
     { 
     } 
}; 

你可以刪除WPoint如果它不包含任何東西,除了類型信息。