boost :: необязательный и тип преобразования

Мне было интересно, если есть элегантный способ бросить boost::optional<A> к boost::optional<B> когда B может быть построен из Aхоть и явно. Это работает:

# include <boost/optional.hpp>

class Foo
{
int i_;
public:
explicit Foo(int i) : i_(i) {}
};

int main()
{
boost::optional<int> i;
... // i gets initialized or not
boost::optional<Foo> foo;
foo = boost::optional<Foo>(bool(i), Foo(i.value_or(0 /*unused value*/)));
return 0;
}

но необходимость помещать туда некоторую ценность, которая никогда не будет использоваться, кажется неловкой. Любое лучшее предложение?

3

Решение

template<class T, class U>
boost::optional<T> optional_cast( U&& u ) {
if (u) return T(*std::forward<U>(u));
else return {};
}

будет забавно также работать с указателями.

int main() {
boost::optional<int> i;
... // i gets initialized or not
boost::optional<Foo> foo = optional_cast<Foo>(i);
return 0;
}

В С ++ 03

template<class T, class U>
boost::optional<T> optional_cast( U const& u ) {
if (u) return T(*u);
else return boost::none;
}

будет работать вместо этого, но будет менее эффективным в ряде случаев.

6

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


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