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

c – 如何划分boost :: optional?

发布时间:2020-12-16 10:09:32 所属栏目:百科 来源:网络整理
导读:我有这样的代码: boost::optionaldouble result = _ind1.Value() / _ind2.Value(); 每个arg都是boost :: optional double太: boost::optionaldouble Value() { return value;} 错误是: 错误1错误C2676:二进制’/’:’boost :: optional T‘没有定义此运
我有这样的代码:

boost::optional<double> result = _ind1.Value() / _ind2.Value();

每个arg都是boost :: optional< double>太:

boost::optional<double> Value() {
    return value;
}

错误是:

错误1错误C2676:二进制’/’:’boost :: optional< T>‘没有定义此运算符或转换为预定义运算符可接受的类型
????2 IntelliSense:没有运算符“/”匹配这些操作数
????????????操作数类型是:boost :: optional< double> / boost :: optional< double>

我明白分裂似乎没有定义.我希望结果是boost :: none如果两个参数中的任何一个都没有 – 否则我希望它是正常的双重除法.我应该自己写吗?

解决方法

当然,支持诸如双倍分割之类的简单操作.

但你并不想分开双打.你试图划分boost :: optional< double> s,这是一个完全不同的故事.

如果需要,可以为此定义除法运算符.它可能看起来像(未经测试):

template<typename T>
boost::optional<T> operator/(const boost::optional<T>& a,const boost::optional<T>& b)
{
    if(a && b) return *a / *b;
    else return boost::optional<T>();
}

在C 11(代码由Yakk提供):

template<class T,class U> struct divide_result {
  typedef typename std::decay<decltype(std::declval<T>()/std::declval<U>())>::type;
};
template<class T,class U> using divide_result_t=typename divide_result<T,U>::type;
template<typename T,typename U>
boost::optional<divide_result_t<T,U>> operator/(const boost::optional<T>& a,const boost::optional<U>& b)
{
    if(a && b) return *a / *b;
    else return boost::none;
}

我使用了一个模板,因为现在它对int,float等也有好处.

(编辑:李大同)

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

    推荐文章
      热点阅读