Я читал документация для std::any_cast
и я нахожу странным, что в API есть приведение, которое либо возвращает значение удерживаемому объекту, либо указатель на него. Почему бы не вернуть ссылку? Копия должна выполняться каждый раз, когда функция вызывается с аргументом без указателя типа.
Я вижу, что указатель версии приведения мог бы сигнализировать о намерениях немного больше и мог бы быть немного более ясным, но почему бы не вернуть возвращаемое значение в виде такой ссылки?
template<typename ValueType>
ValueType& any_cast(any* operand);
вместо
template <typename ValueType>
ValueType* any_cast(any* operand);
Кроме того, кажется, что даже если вы запрашиваете ссылку, приведение удаляет ссылку и возвращает копию хранимого объекта, см. Объяснения возвращаемых значений для перегрузок функций 1-3 здесь. http://en.cppreference.com/w/cpp/utility/any/any_cast
Вы можете увидеть обсуждение стандарта C ++ для этого здесь: https://groups.google.com/a/isocpp.org/forum/#!topic/std-proposals/ngSIHzM6kDQ
Обратите внимание, что Boost определил any_cast
таким образом, более десяти лет, плюс это соответствует static_cast
и друзья. Так что если вы хотите ссылку, сделайте это:
any_cast<Foo&>(x)
Так же, как вы сделали бы для старшего _cast
в C ++.
Других решений пока нет …