2012-01-12 31 views
4

我有一個模板類,我正在使用它來提供一種方法,該方法將使用boost::lexical_cast將其參數std::string轉換爲模板中指定的類型,只有在詞法轉換可行時纔可以。目前要檢查是否有可能,我只是檢查是否爲operator>>定義了相關類型。這是一個人爲的例子,基本上說明了我在做什麼:有沒有辦法使用SFINAE來確定由於提供的類型而導致對模板化函數的調用會失敗?

template <typename ArgType, class Enable = void> 
MyHelperClass 
{ 
    void Foo (ArgType arg&, std::string strArg) { } // not castable; do nothing 
}; 

template <typename ArgType> 
MyHelperClass<ArgType, boost::enable_if<boost::has_right_shift<std::istream, ArgType> >::type> 
{ 
    void Foo (ArgType arg&, std::string strArg) { 
     arg = boost::lexical_cast<ArgType>(strArg); // cast string arg to ArgType 
    } 
}; 

到目前爲止,這工作得很好我的代碼:所有類型的,將不能詞彙投結束了第一個版本和所有其他結束與第二個,至少對於我的代碼使用此類型的類型。我擔心的是我基本上假設只要目標類型是InputStreamable,那麼lexical_cast就不會失敗。用於lexical_cast的boost documentation列出了一些其他要求,我應該檢查一下,但不是創建複雜的enable-if並使用mpl::and_將這些條件串在一起,我想知道:是否有一種方法可以使用SFINAE來測試直接調用lexical_cast是否會因給定的類型而失敗,並且只有在不會失敗時才匹配專用模板?

我只見過用於測試函數或運算符的存在的示例,但從不測試對具有給定類型的模板函數的調用是否會產生錯誤。

+0

您可以將需求封裝到額外的'struct'中。另外,什麼樣的「錯誤」?例外?編譯時錯誤? – Xeo 2012-01-12 03:36:14

+1

這很棘手,因爲即使lexical_cast 無法實例化,也會爲所有T定義lexical_cast ()的返回類型。所以,通常的技巧是行不通的。 – 2012-01-12 05:15:04

+0

我只希望能夠捕捉編譯時錯誤。將需求封裝到'struct'中可能有助於清理代碼,但它不能解決我對「lexical_cast」的實現做出假設的問題。我擔心沃恩是對的,我想做的事是不可能的。 – histumness 2012-01-12 13:55:22

回答

1

恐怕不是。因爲lexical_cast是爲所有T定義的,所以SFINAE不會幫助你。 lexical_cast()的主體將無法編譯某些類型的事實不會導致替換失敗。你可以做的最好的事情就是嘗試預測會導致身體失敗的情況,就像你已經做的那樣。

+0

我有這樣的感覺,但我只是想確定。謝謝! – histumness 2012-01-12 13:51:16

相關問題