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 回答