我试图实现一个完美的 Integral类型,而不会对其底层类型进行隐式转换(只有显式转换),并且遇到以下问题:
std::array<Integral, 10>a{{...}};
Integral index{5};
a[index] = ...; //error: no implicit conversion between Integral and std::size_t
C阵列存在类似问题。 AFAIK问题是operator[]
需要特定类型。如果你的类型与预期类型不匹配并且不能隐式转换为它,我能想到的唯一解决方案是显式转换,getter和要应用于数组的get
函数。
是否有可能实现与explicit operator bool
类似的东西(即仅在特定情况下可隐式兑换 ),但对于operator[]
?
写a[static_cast<std::size_t>(index)]
有点打败了编写积分类型的目的。
答案 0 :(得分:4)
是否有可能实现与
explicit operator bool
类似的东西(即仅在特定情况下可隐式兑换 )
这称为上下文转换为 bool
,仅支持bool
类型。所以,不,它无法完成。
IMO,显式转换(通过成员函数,如Integral::get() const
)是可行的方法。毕竟,除非你试图创建一个毫无用处的类型,否则你的类可能会代表一些不能存储在int
中的值,这意味着转换正在进行必须通过抛出异常来失败。那么明白比隐含更好。
答案 1 :(得分:0)
一些想法:
a)您可以实现对size_t的隐式转换。我相信operator []期望这种类型。这将捕获所有不是size_t的转换。
请注意,这种显式转换可用于捕获正在使用负索引的情况。一种有用的行为。
b)您可能会重载operator []以接受整数类型。当然这会很痛苦,因为你必须为所有类型做这件事。但另一方面,您可能能够在容器上实现索引检查 - 这是另一个有用的功能。
c)你可能会查找&#34;安全的数字&#34;对于一些与外围相关的想法。Robert Ramey