0

SI単位系のシステムを実装しています。単位が漏れたり漏れたりしないようにするために、値を単位に暗黙的に変換したり、その逆をしたりしたくありません。ただし、0 を暗黙的に null ポインターに変換するが、他の値は変換しないポインターでできるように、0 を私の単位系に変換できると非常に便利です。

だから私の質問は: この種の 0 から null ポインターへの暗黙的な変換を複製できますか? それとも、同じことを達成するためにそれを有利に使用できますか?

たとえば、そのようなコンストラクターについてどう思いますか?

constexpr unit_t(void*) : _value(0) { }

注: 単位自体は、値ではなく型にあります。

編集: なぜ 0 からユニットにキャストするのですか?

私がこれを望む理由は、単位を知らないアルゴリズムを書くためです。たとえば、長さの行列があり、それを逆にしたい場合は、最初にその行列式を計算し、それが 0 でない場合は逆行列を返します (そうでない場合、これはエラーです)。

したがって、0 リテラルを一般的な単位として扱うと便利です。そして、これはまさにポインターの場合に起こることです。次のように入力できます。

void* c = 0;

だがしかし:

void f(int a) { void *c = a; }
4

1 に答える 1

2

古典的な解決策は、ユーザーが名前を付けることができないプライベート型へのポインターです。そうすれば、一致するものを取得できる唯一の方法は、 からの暗黙的な変換によるもの0です。(使用void*するということは、実質的にポインタに変換できるものなら何でも渡すことができるということです。)

このソリューションは、整数定数 0 に対してのみ機能することに注意してください。ユーザーが使用したい場合(値の方が意味0.0があると考えているため)、使用できません。double

SomeUnit()デフォルトのコンストラクターの使用を検討することもできます。これにより、クライアントはデフォルトの初期化が必要なときに簡単に書き込むことができます。

于 2012-06-13T09:55:20.110 に答える