首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有办法使用SFINAE来确定对模板化函数的调用是否会因为提供的类型而失败?

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

Stack Overflow用户
提问于 2012-01-12 11:31:49
回答 1查看 393关注 0票数 4

我有一个模板化的类,用于提供一个方法,该方法将使用boost::lexical_cast将其std::string参数转换为模板中指定的类型,前提是可以进行词法转换。目前,为了检查是否可能,我只是简单地检查是否为有问题的类型定义了operator>>。这是一个人为的例子,基本上说明了我正在做的事情:

代码语言:javascript
复制
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_将这些条件串在一起?

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

EN

回答 1

Stack Overflow用户

发布于 2012-01-12 13:49:21

恐怕不行。因为lexical_cast是为所有T定义的,所以SFINAE不会帮到你。对于某些类型,lexical_cast()的主体将无法编译这一事实并不会导致替换失败。你能做的最好的事情就是像你已经做的那样,尝试预测会导致身体衰竭的情况。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8829764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档