像本机类型一样,没有隐式转换的整型

Integral type that acts like a native one without implicit conversions

本文关键字:转换 整型 一样 类型 本机      更新时间:2023-10-16

我试图实现一个完美的整型,没有隐式转换到其底层类型(仅显式),并且我遇到以下问题:

std::array<Integral, 10>a{{...}};
Integral index{5};
a[index] = ...; //error: no implicit conversion between Integral and std::size_t

对于C数组也有类似的问题。我想问题是operator[]期望一个特定的类型。如果您的类型与预期的类型不匹配,并且不能隐式转换为它,我能想到的唯一解决方案是显式强制转换、getter和应用于数组的get函数。

是否有可能实现类似于explicit operator bool的东西(即在特定情况下仅隐式转换),但operator[] ?

a[static_cast<std::size_t>(index)]有点违背了写整型的目的

是否有可能实现类似于explicit operator bool的东西(即在特定情况下仅隐式转换)

这被称为上下文转换为 bool,并且仅支持bool类型。所以,不,这是不可能的。

在我看来,显式转换(通过成员函数,如Integral::get() const)是可行的方法。毕竟,除非您试图创建一个实际上无用的类型,否则可能会有一些您的类可以表示的值不能存储在int中,这意味着转换将不得不抛出异常而失败。

几点思考:

a)可以实现对size_t的隐式转换。我相信操作符[]期望这种类型。这将捕获所有不指向size_t的转换。

注意,这种显式转换可用于捕获正在使用负索引的情况。一个有用的行为。

b)可以重载操作符[]来接受整型。当然,这将是一个痛苦的过程,因为您必须对所有类型都这样做。但另一方面,您可能能够在容器上实现索引检查——另一个有用的功能。

c)你可能会查找"安全数字"的一些外围相关的想法。

罗伯特·Ramey