有没有办法使用SFINAE来确定对模板化函数的调用是否会因提供的类型而失败?

时间:2012-01-12 03:31:49

标签: c++ boost sfinae enable-if lexical-cast

我有一个模板化的类,我用它来提供一个方法,使用boost::lexical_cast将其std::string参数强制转换为模板中指定的类型,只有在可以进行词法转换的情况下。目前要检查是否可能我只是检查是否为相关类型定义了operator>>。这是一个人为的例子,基本上说明了我在做什么:

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的调用对于给定的类型是否会失败,并且只有在它不会失败时才匹配专用模板?

我只见过测试函数或运算符是否存在的例子,但是从不测试对给定类型的模板化函数的调用是否会产生错误。

1 个答案:

答案 0 :(得分:1)

我不敢。因为lexical_cast是为所有T定义的,所以SFINAE不会帮助您。 lexical_cast()的主体无法针对某些类型进行编译这一事实不会导致替换失败。你可以做的最好的事情是尝试预测导致身体失败的条件,就像你一直在做的那样。