3

私は、多数のライブラリ用の汎用C ++ラッパーが必要なプロジェクトに取り組んでいます。ライブラリが次のようなCスタイルの関数を提供している場合は、次のようになります。

//assignment
lib_set(lib_type data, lib_type input);
lib_set_si(lib_type data, long input);
lib_set_ui(lib_type data, unsigned long input);

//addition
lib_add(lib_type data, lib_type input);
lib_add_ui(lib_type data, unsigned long input);

本当に必要でないときに一時的なオブジェクトを作成することを避けるために、私は次のようなものになりました:

class wrapper
{
private:
    lib_type data;
public:

    wrapper()
    {
        lib_set_ui(this->data, 0UL);
    }

    wrapper (const wrapper &input)
    {
        lib_set(this->data, input.data);
    }

    wrapper (const long input)
    {
        lib_set_si(this->data, input);
    }

    wrapper (const unsigned long input)
    {
        lib_set_ui(this->data, input);
    }

    wrapper &operator+= (const wrapper &input)
    {
        lib_add(this->data, input.data);
        return *this;
    }

    wrapper &operator+= (const unsigned long input)
    {
        lib_add_ui(this->data, input);
        return *this;
    }
};

残念ながら、これを行うと:

wrapper x(2);
x += -2;

intコンパイラ(GCC / VS2010)は、を暗黙的にキャストしようとしているという警告を発行しunsigned longません。これは、私が取得したいものではありません...

したがって、この場合、クラスの演算子をオーバーロードして、必要のないときに一時オブジェクトwrapperを作成する必要がないようにするにはどうすればよいでしょうか。wrapperオーバーロードを削除するとwrapper &operator+= (const unsigned long input)、次のようなものを使用する必要があります。

wrapper x(2);
x += wrapper(-2);
x += -2;//implicitly casts -2 to wrapper

しかし、コンパイラが余分なオブジェクトを最適化できる可能性があるという事実に頼ることはできないと思います...

4

1 に答える 1

3

あなたが説明しているように、暗黙の変換を無効にする方法がわかりません。ただし、少なくともコンパイラに警告を発行させることはできます。

gnu Mingw / gccを使用している場合は、コンパイル時にパスするだけ-Wconversionです-Wsign-conversion。上記のコードで警告が表示されるはずです。

MSVCの場合、/Wallまたは/W4同じことを取得する必要があります。

于 2012-12-19T19:29:32.137 に答える