加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 有没有办法使用SFINAE来确定对模板化函数的调用是否会因提

发布时间:2020-12-16 06:58:29 所属栏目:百科 来源:网络整理
导读:我有一个模板化的类,我用它来提供一个方法,使用boost :: lexical_cast将其std :: string参数强制转换为模板中指定的类型,只有在可以进行词法转换的情况下.目前检查是否可能我只是检查操作符是针对有问题的类型定义的.这是一个人为的例子,基本上说明了我在做
我有一个模板化的类,我用它来提供一个方法,使用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()的主体无法针对某些类型进行编译这一事实不会导致替换失败.你可以做的最好的事情是尝试预测导致身体失败的条件,就像你一直在做的那样.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读