我有一个模板化的类,我用它来提供一个方法,使用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()的主体无法针对某些类型进行编译这一事实不会导致替换失败.你可以做的最好的事情是尝试预测导致身体失败的条件,就像你一直在做的那样.