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

c – 使用SFINAE但不创建编译错误

发布时间:2020-12-16 09:49:07 所属栏目:百科 来源:网络整理
导读:我的程序生成具有“类型”和标识符的随机字符串.像这样: float lHTY8Au8b9 = float();int dO3PNUInH6 = int();float B_MtShimak = float();float hgi_TzaVEv = float();double mfW8kr6h6q = double();std::string lSLj9antfj = std::string();char MQkeARWY
我的程序生成具有“类型”和标识符的随机字符串.像这样:

float       lHTY8Au8b9 = float();
int         dO3PNUInH6 = int();
float       B_MtShimak = float();
float       hgi_TzaVEv = float();
double      mfW8kr6h6q = double();
std::string lSLj9antfj = std::string();
char        MQkeARWYTL = char();
char        Oe7G_ZRJy6 = char();
float       qUwmOWeilK = float();
double      FJYIODwQfx = double();

然后我有以下内容,看看是否可以添加两个任意变量:

template <typename A,typename B>
typename std::enable_if<std::is_convertible<A,B>::value,decltype(A() + B())>::type
    try_to_add(A a,B b) {
        return a + b;
    }

当然,它的工作原理是因为我收到以下错误:

main.cpp:51:54: error: no matching function for call to ‘try_to_add(double&,std::string&)’

  try_to_add<double,std::string>(mfW8kr6h6q,lSLj9antfj);

但是,我想要的是一个不会导致编译错误的候选列表.我无法对模板参数进行硬编码,因为它只接受整数,并且我无法检查生成器程序内部,因为它们只是字符串,并且尝试将try_to_add与不可转换类型一起使用将导致编译错误.我知道SFINAE是错误的方法,但有没有办法让try_to_add无所事事,而不是生成编译错误?

Coliru

解决方法

使用不执行任何操作的反向条件添加另一个重叠.

template <typename A,typename B>
typename std::enable_if<!std::is_convertible<A,B>::value>::type
try_to_add(A,B) { }

(编辑:李大同)

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

    推荐文章
      热点阅读