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

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

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调用是否会失败,并且只有在不会失败的情况下才匹配专用模板?

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

解决方法

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

相关文章

一.C语言中的static关键字 在C语言中,static可以用来修饰局...
浅谈C/C++中的指针和数组(二) 前面已经讨论了指针...
浅谈C/C++中的指针和数组(一)指针是C/C++...
从两个例子分析C语言的声明 在读《C专家编程》一书的第三章时...
C语言文件操作解析(一)在讨论C语言文件操作之前,先了解一下...
C语言文件操作解析(三) 在前面已经讨论了文件打开操作,下面...