更改结构元素的const

时间:2016-12-28 12:34:59

标签: c++ c++11 const

我有一个指向a:

的指针
struct KeyValue {
  K key;
  V value;
}

我希望返回对解释为

的相同内存位置的引用
struct IKeyValue {
  const K key;
  V value;
}

在C ++ 11中有没有一种干净的方法?

只要对原始KeyValue的任何引用有效,对IKeyValue的引用都应该有效。

我这样做的原因是因为我正在使用开放寻址实现HashTable<K, V>。因此,我有一个KeyValue数组,其中一些是完全构造的(键和值构造),其中一些是半构造的(只有empty_keytombstone_key构造的键。我希望使用此结构的迭代器,以便可以读取it->key但不能修改it->value,并且可以读取和修改it->key()。而且我不希望在标准库中完成it->value()IKeyValue* p = (IKeyValue*)malloc(n * sizeof(IKeyValue)); 等内容。

由于这似乎很难做到这一点,我正在考虑答案所建议的另一种选择。我可以在我的HashTable中构建一个IKeyValue数组:

{{1}}

但是,我是否允许使用新的安置来构建一个新的位置的键或值?

5 个答案:

答案 0 :(得分:4)

您可以提供参考成员和构造函数

struct IKeyValue {
     const K& key;
     V& value;
     IKeyValue(KeyValue& x) : key(x.key), value(x.value) {}
};

但正如comment中所提到的,引用实例的生命周期管理可能会成为一个问题。

答案 1 :(得分:4)

IKeyValue中,使用访问者函数而不是数据字段:

struct IKeyValue {
private:
    KeyValue & keyValue;
public:
    IKeyValue (KeyValue & keyValue) : keyValue (keyValue) {}

    K const & key () const { return keyValue.key; }
    V & value () { return keyValue.value; }
    V const & value () const { return keyValue.value; }
};

KeyValue kv = ...;
IKeyValue ikv (kv);

... ikv.key (); // returns kv.key;
ikv.value () = ...; // sets kv.value;

答案 2 :(得分:1)

您不能,因为它们不是同一类型,IKeyValue也不是KeyValue的派生类。

您需要重新设计代码以使用不同的代码,例如返回类的视图。

答案 3 :(得分:0)

最简单的方法是将您的数据成员设为私有,并在需要时提供getter和setter。根据您的编写,您似乎希望密钥是只读的,并且值是读写的。所以你可以这样做:

class KeyValue
{
public:
   KeyValue(K k, V v) : key(k), value(v) {}
   K get_key() const {return key;}
   V get_value() const {return value;}
   void set_value(V v) {value = v;}
private:
   K key;
   V value;
};

现在密钥只能在构造函数中设置,并且从那一刻起是只读的。

答案 4 :(得分:0)

好的,这是我在这里提供的一个非常奇怪的解决方案,有些人认为这是一个滥用的解决方案,但如果你的“价值”总是可以改变,你可以做类似的事情:

struct KeyValue {
  K key;
  mutable V value;
};

然后按住const KeyValue&,以锁定密钥的常量。