【发布时间】:2016-12-01 18:08:54
【问题描述】:
对于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比较的性能? -
是的。我担心每一个可避免的开销。它只是丑陋的界面
-
这些函数的某些版本将引用作为参数。他们只是抛出失败(而不是返回
nullptr)。 -
是的,我现在。但它们是不同类型的动作。它们是断言而不是请求。
-
@Nicol 有道理。但这不是我的问题的答案