7

関連する質問:組み込み型の std::map デフォルト値 -- 微妙な違いは、値が初期化されている0かゴミであるかを知りたいということではなく、「コンストラクター」を指定したいということです。クラス定義にオーバーヘッドが伴うかどうかは気にしません。クリーンな「特別な」基本型が必要なだけです。構文ハックでさえできます。非基本型はこれを行うのが非常に簡単で、コンストラクターのすべての仕事です。

ハッシュマップを持ちたいのですunordered_map<void *, int>が、そのすべての値をデフォルトで初期化して、-1代わりに0またはガベージにします。これは、ゼロが有効なインデックスであるためです。私は、明らかに無効な値でデフォルト初期化することを好みます。

これを行うには、いくつかのずさんな方法があると思います。

struct minus1 {
    int i; 
    minus1() i(-1) {}
};
unordered_map<void*, minus1>

.iしかし、intにアクセスするために使用する必要があり、実際にはintである必要があるため、これは好きではありません。

わかりましたので、マップにこれを処理させることができます:

struct PointerToIDHash {
    std::unordered_map<void *, int> h;
    PointerToIDHash() {
        // ctor is powerless to affect the initialized values of future insertions into h
    }
};

まあ、今は私も持ってい.hます。うーん。テンプレートから継承できますか? (恐ろしく聞こえるかもしれませんが、これを引き抜くことができれば、これはきれいな方法かもしれません)

int のように透過的に動作するが、常に に初期化される型を作成するにはどうすればよい-1ですか?

C++ 11を使用する場合と使用しない場合の両方の方法を知りたいです。

4

2 に答える 2

11
#include <unordered_map>
#include <iostream>

using namespace std;

template<typename T, T default_value>
class SelfInitializer
{
public:
    SelfInitializer(T x = default_value) : x(x) {}
    operator T&() { return x; }
    operator const T&() const { return x; }
private:
    T x;
};

// demo
int main()
{
    using minus1 = SelfInitializer<int, -1>;

    unordered_map<int, minus1> m;

    m[7] = 3; // assignment works

    minus1 x = 3;

    int y = x; // conversion to int works

    int z = int(x); // explicit conversion works

    cout << m[7] << endl;
}
于 2013-08-25T23:01:59.200 に答える
8

変換演算子を追加しint&て、構造体minus1が int のように動作するようにします

struct minus1 {
    int i; 
    minus1() : i(-1) {}
    operator int&() { return i; }
};
于 2013-08-25T21:49:11.523 に答える