我有一個模板類,我正在使用它來提供一種方法,該方法將使用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
是否會因給定的類型而失敗,並且只有在不會失敗時才匹配專用模板?
我只見過用於測試函數或運算符的存在的示例,但從不測試對具有給定類型的模板函數的調用是否會產生錯誤。
您可以將需求封裝到額外的'struct'中。另外,什麼樣的「錯誤」?例外?編譯時錯誤? – Xeo 2012-01-12 03:36:14
這很棘手,因爲即使lexical_cast無法實例化,也會爲所有T定義lexical_cast ()的返回類型。所以,通常的技巧是行不通的。 –
2012-01-12 05:15:04
我只希望能夠捕捉編譯時錯誤。將需求封裝到'struct'中可能有助於清理代碼,但它不能解決我對「lexical_cast」的實現做出假設的問題。我擔心沃恩是對的,我想做的事是不可能的。 – histumness 2012-01-12 13:55:22