2

使用するboost::anyことは非常に便利ですが、ゲッターがないことは非常にany_cast気のめいることであり、必要なタイプにキャストするために常に使用する必要があります。しかし、なぜそれはそのようなものがないのですか?私の意見では、以下の1つが有用なメンバーになる可能性があります。見えない悪いところはありますか?

template <class T>
void get(T * handle)
{
    *handle = boost::any_cast<T>(*this);
}

編集:

私が見る唯一の悪いことは、このゲッターには代入演算子が必要だということです。

4

2 に答える 2

5

おそらく、とまったく同じように動作するためですany_castが、説明が少なくなります。any_castキャスト、型変換を実行していることを示します。オブジェクトから値を取得しようとしていますany。したがって、間違ったタイプで呼び出すと操作が失敗する可能性があることはユーザーには明らかです。

get関数は、障害状態についてあまり明確ではありません。私は通常、単に名前get 付けられた関数が失敗する可能性があるとは思っていません。もしそうなら、私はそれのセマンティクスがわかりません。

get関数が必要な場合は、代わりに使用する必要がありますboost::variant

于 2011-05-03T17:00:09.117 に答える
2

ポイントは、キャストの失敗の有無が構築に使用される正確なタイプに非常に敏感であるため、テンプレート引数の推論を使用しないany_castように人々に強制することです。

この使用法は明らかです:

any x(2); // store an int
double f = any_cast<int>(x); // ok, request for an int, then cast to double

これはそうではありません:

int g;
...
x.get(&g); // Ok. For now.

確かに、今あなたがあなたのコードをリファクタリングし、あなたが置き換えると想像してください

int g;

double g;

今、新しいコードは次のようになります

double g;
... // There can be 100s of lines here
x.get(&g); // This line HAS changed semantics and cast will fail

これにより、デバッグに30分ほどかかる可能性があります。

于 2011-05-17T10:40:49.073 に答える