积分类型,就像本机一样,没有隐式转换

时间:2014-03-19 19:52:47

标签: c++ c++11

我试图实现一个完美的 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)]有点打败了编写积分类型的目的。

2 个答案:

答案 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