std::any - 为啥它缺少这么多运算符?

Posted

技术标签:

【中文标题】std::any - 为啥它缺少这么多运算符?【英文标题】:std::any - why does it lack so many operators?std::any - 为什么它缺少这么多运算符? 【发布时间】:2018-12-06 12:36:44 【问题描述】:

我正在考虑将 std::any 用于类型擦除作为我正在构建的接口的一部分,我想知道为什么它缺少这么多运算符,例如“+”、“==”。我对 Coliru here 进行了修改,在那里我将 std::any 扩展为可汇总和可打印到 ostream 中。这仅适用于现在持有 double 的任何人,但这个概念是有效的,它只是需要完成以支持所有基本数字数据类型(只要 lhs 和 rhs 是操作数的相同类型)的实现。

考虑到我能够在这么短的时间内扩展任何类似的东西,为什么 stl 实现在操作数方面如此有限?

感谢任何想法。

【问题讨论】:

any 设置为没有这些运算符时,您的扩展程序会怎样? 限制是扼杀它的原因。您必须自己对所有可能的操作数类型集合的笛卡尔积进行类型擦除,这对于内置类型和标准类型来说是令人生畏的,对于任意用户定义的类型来说是不可能的,并且在任何情况下都会产生巨大的开销。 我接受这是一个障碍,但是考虑到 std::any 是类型安全的,对于相同类型的 a1 和 a2 的 std::any sum(a1 + a2) 之类的赋值不应该在概念上起作用?我建议支持 lhs 和 rhs 类型的所有可能组合。 不,不应该。 std::any 是一个容器。它不是(也不应该被认为是)实际价值。遵循该原则,为其定义运算符与为std::map 定义运算符具有相同的含义。例如:不是很多。 @d-karl 可以将其限制为相同的类型,您必须键入擦除所有运算符以及对象。但是,对于没有多少功能,这又是相当多的强制开销(并且错误会在运行时被捕获,呃)。对于标准容器类型而言,将这种利用留给用户更有意义。 【参考方案1】:

因为总的来说(这是std::any 所追求的)这些运算符没有意义。关于你的具体例子;

+: 对于类似日期的对象来说毫无意义。

==:对只写对象没有意义。

【讨论】:

以上是关于std::any - 为啥它缺少这么多运算符?的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个执行计划中的 Sort 算子成本这么高?

为啥 sizeof 被认为是运算符?

为啥 std::any 没有 unsafe_any_cast?

为啥模数运算符很慢?

为啥在 dlopen'd 函数中传递的 std::any 的 std::any_cast 会引发错误

20165227 结对编程项目-四则运算 第一周