相关问题:std::map default value for build-in type - 细微的区别是我想要的不仅仅是知道值是初始化为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
。 Joey:嗯。我可以从模板继承吗? (听起来很可怕,但如果它可以被拉掉,这可能是一种干净的方式)
如何创建一个透明地像int一样但始终初始化为-1
的类型?
我更愿意在使用和不使用C ++ 11时知道如何执行此操作。
答案 0 :(得分: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;
}
答案 1 :(得分:8)
将转化运算符添加到int&
,以便您的结构minus1
的行为类似于int
struct minus1 {
int i;
minus1() : i(-1) {}
operator int&() { return i; }
};