我有一个模板化的类,用于提供一个方法,该方法将使用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概述了一些其他需求,我可能也应该检查这些需求,但我想知道:有没有一种方法可以直接使用SFINAE直接测试对给定类型的lexical_cast调用是否会失败,并且只有在不会失败时才匹配专用模板,而不是创建一个复杂的enable-if并使用mpl::and_将这些条件串在一起?
我只见过测试函数或运算符是否存在的示例,但从未测试过对具有给定类型的模板函数的调用是否会产生错误。
发布于 2012-01-12 13:49:21
恐怕不行。因为lexical_cast是为所有T定义的,所以SFINAE不会帮到你。对于某些类型,lexical_cast()的主体将无法编译这一事实并不会导致替换失败。你能做的最好的事情就是像你已经做的那样,尝试预测会导致身体衰竭的情况。
https://stackoverflow.com/questions/8829764
复制相似问题