我有一个指向a:
的指针struct KeyValue {
K key;
V value;
}
我希望返回对解释为
的相同内存位置的引用struct IKeyValue {
const K key;
V value;
}
在C ++ 11中有没有一种干净的方法?
只要对原始KeyValue的任何引用有效,对IKeyValue的引用都应该有效。
我这样做的原因是因为我正在使用开放寻址实现HashTable<K, V>
。因此,我有一个KeyValue
数组,其中一些是完全构造的(键和值构造),其中一些是半构造的(只有empty_key
或tombstone_key
构造的键。我希望使用此结构的迭代器,以便可以读取it->key
但不能修改it->value
,并且可以读取和修改it->key()
。而且我不希望在标准库中完成it->value()
和IKeyValue* p = (IKeyValue*)malloc(n * sizeof(IKeyValue));
等内容。
由于这似乎很难做到这一点,我正在考虑答案所建议的另一种选择。我可以在我的HashTable中构建一个IKeyValue数组:
{{1}}
但是,我是否允许使用新的安置来构建一个新的位置的键或值?
答案 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&
,以锁定密钥的常量。