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 - 为啥它缺少这么多运算符?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 std::any 没有 unsafe_any_cast?