Если я положил T
в std::any
, я могу получить его с any_cast<T>(my_any)
. Но имеет ли стандарт (= C++ 17 в фазе голосования в данный момент) такую функцию, как any_cast<T>(optional<any> oa)
, которая возвращает nullopt
, если oa nullopt
и std::any_cast<T>(oa.value())
в противном случае? Или что-то вдоль этих линий?any_cast с std :: any и std :: optional
Edit: Так как люди, кажется, предлагая реализации, я буду также список того, что я использую сейчас:
/* using magic here to select between boost/std::experimental/std versions */
template<typename T>
inline const optional<T> any_cast(const optional<any>& operand)
{
return operand ?
optional<T>(any_cast<T>(operand.value())) :
optional<T>(nullopt);
}
Мне нравится ваше предложение, но вам действительно нужны 3 аргумента шаблона? – einpoklum
Если вы хотите правильности и гибкости, да: 'T' используется для' any_cast'; 'TOptional' используется для совершенства-пересылки значения опциона; 'TF' используется для общего вызываемого объекта. Вы можете реализовать его без 'TOptional', но вам потребуется повторение кода, чтобы правильно перемещать' * o', когда 'o' передается как r-значение. –
Но у меня нет f. Вы заставляете меня комбинировать кастинг с использованием его результата, который не похож ни на какой бросок. – einpoklum