数学演算をラップするクラスがあるとします。おもちゃの例を使ってみましょう
class Test
{
public:
Test( float f ) : mFloat( f ), mIsInt( false ) {}
float mFloat;
int mInt;
bool mIsFloat;
};
次のプロトタイプを使用して、演算子のオーバーロードを作成したいと思います。
float operator=( const Test& test )
{
if ( !test.mIsFloat ) return *this; // in this case don't actually do the assignment
return test.mFloat; // in this case do it.
}
私の質問は次のとおりです。組み込みの戻り値の型で operator= をオーバーロードできますか? もしそうなら、組み込み型を参照する方法はありますか?
ビルトインをクラスでラップすれば、これができることはわかっています。しかし、この場合、代入演算子を LHS の組み込み型で動作させたいと考えています。
使用例:
Test t( 0.5f );
float f = t; // f == 0.5
int i = 0;
i = t; // i stays 0.
更新: 助けてくれてありがとう。おもちゃの例から少し拡張して、私が実際にやろうとしていることを人々が理解できるようにします。
さまざまなタイプのパラメーターのツリーから構成パラメーターを取得できる構成システムがあります(整数、浮動小数点数、文字列、配列などにすることができます)。
次のような操作でツリーからアイテムを取得できます。
float updateTime = config["system.updateTime"];
ただし、「system.updateTime」が存在しない可能性があります。または、タイプが間違っています。一般に、構成にはデフォルトのブロックがあり、構成からデフォルトをオーバーライドするコードがあります。
float updateTime = 10;
const char* logFile = "tmp.log";
... etc etc...
私は次のようなことをしたい:
updateTime = config["system.updateTime"];
オーバーライドがある場合に操作が成功する場所。そのため、通常、operator[] からの戻り値がツリー内の「無効な」ノードである場合、割り当ては行われません。
今、私は次のような関数でそれを解決します:
getConfig( config, "system.updateTime", updateTime );
しかし、代入演算子を使用したいと思います。
ビルトインをラップするクラスを作成したい場合は、これを行うことができます。
class MyFloat
{
operator=( const Test& test ) { if (test.isValidNode() ) f = test.float(); return *this; }
float f;
}
しかし、割り当てをオーバーロードするためだけに、ビルトインを自明なクラスでラップしない方がよいことは明らかです。質問は - これは c++ で可能ですか?