2

この擬似コードのようなことをする方法はありますか(ところで、私はこれを行うためにテンプレートを使用できないことを知っています、それは単なる説明のためです):

template<operator Op>
int operator Op (int a, number b) {
    return (a Op to_int(b));
}

あなたは要点を正しく理解します。現在、これを行うために多くのオーバーロードを使用していますが、繰り返しが多すぎます。void *ポインター(関数args用)を使用して何かを実行し、最終的にruntime-typeid情報を渡そうとしましたが、コードが複雑すぎるように見えました。その他の解決策...

あなたのアイデアに感謝します

オーバーライドされないメソッドを書き込もうとしています...オーバーライドしたい残りのopは言うまでもなく、+、-、/、*のためだけに12を記述しなければなりません。

繰り返したくない具体的な例を挙げましょう。

scalar operator Op (scalar a, string b) {..Op..}
scalar operator Op (scalar a, number b) {..Op..}
scalar operator Op (scalar a, scalar b) {..Op..}

処理は異なりますが、内部で計算を行う必要がある場合は、演算子が異なることを除いて同じです。したがって、12個のオーバーロードされたメソッドを実行する代わりに、3個を実行します。内部のコードは、最初の図よりも少し長くなる可能性があります。申し訳ありません。

私は解決策を見つけたと思います:http: //en.wikipedia.org/wiki/Barton-Nackman_trick またはブーストライブラリnevsanが指摘しました。

4

5 に答える 5

4

マクロでこれを行うのに役立つと思います:

#define DEFINE_NUMBER_OP(op) \
int operator op (int a, number b) { \
    return (a op to_int(b));\
}\
\
int operator op (number a, int b) { \
    return (to_int(a) op tb);\
}\
\
int operator op (number a, number b) { \
    return <generic code to do op on numbers>;\
}\
\

次に、それを使用します: DEFINE_NUMBER_OP(+);

しかし、私は代わりにあなたのアプローチを再考することを検討します. ユーザーが異なるタイプを自動的に混合できるようにせず、必要な計算を明示的に示すように強制します。number OP number一連の int 操作を暗黙的にサポートするのではなく、演算子のみをサポートします。

EDIT:もう少し詳しく説明すると、多くの暗黙的な演算子のサポートを開始すると、間違いを犯してデバッグに数時間または数日かかる可能性のある不要な操作を実行するのが非常に簡単になります。 (あなたの意図を 1 回書くだけでよく、最後までコードを読むたびに人々はあなたの意図を明確に理解できることを忘れないでください)。

于 2012-08-22T15:44:42.277 に答える
1

最後に、関数名を定義しています。したがって、言語でこれを厳密に行う方法はありません。

ただし、これはおそらくプリプロセッサを使用して達成できるものです。

于 2012-08-22T15:24:05.103 に答える
1

免責事項 - 私はこれに反対です:

struct A
{
    operator int() {return 0;}
};

1+a( where ais an ) のような操作を実行しようとすると、キャストは暗黙的に行われますA

さらに、その機能はもう必要ありませんto_int

やらないで

于 2012-08-22T15:28:51.740 に答える
1

これはあなたの状況に役立つかもしれませんし、そうでないかもしれませんが、 チェックアウト ブーストオペレーター.

于 2012-08-22T15:47:44.593 に答える
1

これは、実際にはマクロのタスクである可能性があります。

#define DEFINE_OPERATOR_( op, res, lhs, rhs, ltr, rtr ) \
   res operator##op( lhs l, rhs r ) { return ltr op rtr; }
#define DEFINE_OPERATOR_L( op, res, lhs, rhs ) \
   DEFINE_OPERATOR_( op, res, lhs, rhs, to_int(lhs), rhs )
#define DEFINE_OPERATOR_R( op, res, lhs, rhs ) \
   DEFINE_OPERATOR_( op, res, lhs, rhs, lhs, to_int(rhs) )
#define DEFINE_OPERATOR_BOTH( op, mytype, othertype ) \
   DEFINE_OPERATOR_L( op, othertype, mytype, othertype ) \
   DEFINE_OPERATOR_R( op, othertype, othertype, mytype )

DEFINE_OPERATOR_BOTH( *, number, int );
DEFINE_OPERATOR_BOTH( /, number, int );
//...

#undef DEFINE_OPERATOR_BOTH
#undef DEFINE_OPERATOR_L
#undef DEFINE_OPERATOR_R
#undef DEFINE_OPERATOR_
于 2012-08-22T15:48:07.813 に答える