对于 std::any
和 std::variant
,我们有函数来请求对象的当前包含值,并返回 nullptr
,如果请求无法满足(就像 dynamic_cast
一样):
template<class ValueType>
const ValueType *any_cast(const any *operand);
template<class ValueType>
ValueType *any_cast(any *operand);
并且
template <class T, class... Types>
std::add_pointer_t<T> get_if(variant<Types...> *pv);
template <class T, class... Types>
std::add_pointer_t<const T> get_if(const variant<Types...> *pv);
两者都将指针作为参数。为什么?这不是高效的。实现每次都必须检查参数是否不是nullptr
。nullptr
参数有任何意义吗?
这些函数可以作为类成员或者采用引用作为参数(名称可能略有不同)。为什么会出现这种次优设计的原因?只是模仿dynamic_cast
接口吗?
nullptr
进行比较的性能? - Nicol Bolasnullptr
)。 - Barryvariant
访问者比使用一系列get_if
调用的任何代码性能都要优越。至于any
,像你这样测试几个替代方案的代码无论如何都会有可怕的性能(更不用说阅读时的普遍丑陋)。简而言之,您已经处于次优路径上了;如果它比可能的情况略微不够优化,那又有谁在乎呢? - Nicol Bolas