如何创建自我初始化的C++基本类型?

Ste*_* Lu 7 c++ c++11

相关问题:std :: map内置类型的默认值 - 细微的区别是我想要知道值是初始化0还是垃圾,我想指定一个"构造函数".我甚至不关心它是否涉及类定义的开销,我只想要一个干净的"特殊"基本类型.即使是语法黑客也会这样做.非基本类型很容易做到这一点,它是构造函数的全部工作.

我想要一个哈希映射,unordered_map<void *, int>但要将其所有值默认初始化为-1而不是0或者垃圾.这是因为零是一个有效的索引,我宁愿使用肯定无效的值进行默认初始化.

我想我可以看到一些草率的方法:

struct minus1 {
    int i; 
    minus1() i(-1) {}
};
unordered_map<void*, minus1>
Run Code Online (Sandbox Code Playgroud)

但我不喜欢这个,因为我必须使用.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
    }
};
Run Code Online (Sandbox Code Playgroud)

嗯,废话现在我也有.h.Joey:嗯.我可以从模板继承吗?(听起来很可怕,但如果它可以被拉掉,这可能是一个干净的方式)

我怎样才能创建一个透明地像int一样的类型,但总是被初始化为-1

我更愿意知道如何使用和不使用C++ 11.

And*_*zos 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;
}
Run Code Online (Sandbox Code Playgroud)


a.l*_*ram 8

添加转换运算符,以int&使您的结构minus1行为类似于int

struct minus1 {
    int i; 
    minus1() : i(-1) {}
    operator int&() { return i; }
};
Run Code Online (Sandbox Code Playgroud)

  • 你可能也想要一个转换构造函数.`minus1(int n):i(n){}`[或者与默认构造函数结合,`minus1(int n = -1):i(n){}`. (2认同)