如何划分提升::可选<double>?

how to divide boost::optional<double>?

本文关键字:可选 lt double gt 何划分 划分      更新时间:2023-10-16

我有这样的代码:

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

每个参数也是boost::optional<double>

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,否则我希望它是正常的二重除法。我应该自己写吗?

当然支持像除法这样简单的操作。

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

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

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等。