【发布时间】: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 可以将其限制为相同的类型,您必须键入擦除所有运算符以及对象。但是,对于没有多少功能,这又是相当多的强制开销(并且错误会在运行时被捕获,呃)。对于标准容器类型而言,将这种利用留给用户更有意义。