3

実際のコードを何も変更せずに、プログラムの機能を調整する (または情報を得る) つもりです。私は当初、C++ 演算子のオーバーロード機能を使用してこれを実行できることを望んでいましたが、最初のテストは満足のいくものではありませんでした。

コンクリート

sample.cファイルに単純な関数があります。

void dunno() {
    int x = 1;
    int y = 4;
    int z = x + y;
}

機能を変更するために、(頭の中で) 次のようなヘッダー ファイルを作成します。

...

int operator+(int x1, int x2) // this syntax is obviously not allowed by C++?
{
    // Change and gain knowledge here!
    return something here;
}   


#include "sample.c"

...

言い換えれば、たとえば、追加される 2 つの int の本当の意味を変更しようとしています。そして最も重要なのは、変更されていない関数が 2 つの int を追加しようとするときに、標準の C int+int の代わりに、演算子のオーバーロードされた関数を呼び出す必要があることです...

申し訳ありませんが、私が言おうとしていることをきちんと説明するのは難しいです.

4

2 に答える 2

4

はい、それを行うことができますが、オペランドの少なくとも 1 つがユーザー定義型 (つまり、あなたの例intが機能しないことを意味します) であり、その型にその演算子の定義がまだない場合 (または複数の定義エラーが発生します)。

于 2012-09-27T16:06:07.153 に答える
2

インターセプトするプリミティブごとに値ラッパー クラスを記述し (またはそれをストレージ タイプのテンプレートにする)、次のようにマクロを使用することで、これを機能させることができる可能性があります。

template <typename T> class Primitive;
template <typename T>
Primitive<T> operator+(Primitive<T>, Primitive<T>);

template <typename T> class Primitive {
    T value;
public:
    typedef Primitive<T> MyType;
    Primitive<T>(T);
    // ...    
    friend MyType operator+<T>(MyType, MyType);
    // etc. etc.
};


#define int Primitive<int>
#include "sample.c"
#undef int

...

しかし、これは想像を絶するほど毛むくじゃらになるので、本当にやるべきではありません。

理解しておくべき重要なことは、これを行うことでコードを大幅に変更することになるため、動作がどの程度変更されるかを確認するのは難しいということです。sample.cまた、行外の関数または変数を宣言するために含まれているヘッダーを壊すだけです。

より良いアプローチは、おそらくデバッガーでコードをステップスルーすることです.それが何をするのかを本当に知りたい場合(または、適切な場合は、dunnoマクロハッカーなしでデバッグ値の型を渡すことができるように、そのデータ型をテンプレート化します)。

于 2012-09-27T16:24:52.677 に答える