3

私はそのようなコードを持っています:

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>

分割が定義されていないように見えることは理解しています。boost::none2つの引数のいずれかがそうである場合、結果が期待されますnone-それ以外の場合は、通常の二重除算になります。これは自分で書けばいいのでしょうか?

4

1 に答える 1

11

もちろん、double の除算などの簡単な操作もサポートされています。

しかし、倍精度を割ろうとしているわけではありません。sを分割しようとしています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などにも適しているため、テンプレートを使用しました。

于 2014-04-23T16:46:55.067 に答える