как разделить повышение :: опционально & lt; double & gt ;?

У меня есть такой код:

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::none если любой из двух аргументов none — иначе я хочу, чтобы это было нормальное двойное деление. Должен ли я просто написать это сам?

3

Решение

Конечно, такая простая операция, как деление двойников, поддерживается.

Но вы не пытаетесь разделить двойники. Вы пытаетесь разделить 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 и т. Д.

11

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector