【问题标题】:how to divide boost::optional<double>?如何划分 boost::optional<double>?
【发布时间】:2014-04-23 16:39:17
【问题描述】:

我有这样的代码:

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

每个参数也是boost::optional&lt;double&gt;

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

错误是:

Error 1 error C2676: binary '/' : 'boost::optional<T>' does not define this operator or a conversion to a type acceptable to the predefined operator 2 IntelliSense: no operator "/" matches these operands operand types are: boost::optional<double> / boost::optional<double>

我知道似乎只是没有定义部门。如果两个参数中的任何一个是none,我希望结果为boost::none - 否则我希望它是正常的双除法。我应该自己写吗?

【问题讨论】:

    标签: c++ boost boost-optional


    【解决方案1】:

    当然支持双精度除法这样简单的运算。

    但你并没有试图将双打分开。你试图划分boost::optional&lt;double&gt;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 等。

    【讨论】:

    • 是否需要将返回值转换为boost::optional&lt;double&gt;?还是有隐式转换?
    • @Ferruccio:它有一个隐式转换。
    • 什么,不支持T/U 自动升级?
    • @Yakk:可以写升级版。 :-)
    • C++11 版本支持类型不匹配的optional&lt;A&gt;/optional&lt;B&gt;(即一个是int,另一个是double
    猜你喜欢
    • 2015-02-07
    • 2014-04-09
    • 2014-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-14
    • 1970-01-01
    相关资源
    最近更新 更多