我正在用C ++设计一个公共API,并且相信我想保留看起来像int& Value()
和const int& Value() const
的C ++属性 - 函数样式约定,而不是返回的get / set前缀/按值分配,因为我觉得使用模式更简洁,同样可读,同时非常容易融入现有的C ++代码。
我需要让程序员提供自己的元数据。我选择通过公开void*
属性函数来做到这一点。问题当然是签名如下:
class foo {
int& Value();
const int& Value() const;
void* Metadata()
void* const Metadata() const
};
...不起作用,因为以下内容无法编译:
void* ptr = ...;
foo.Metadata() = ptr;
因此,我必须使用以下内容使其工作:
class foo {
int& Value();
const int& Value() const;
void* GetMetadata();
void SetMetadata(void* const data);
};
但这样会使样式不一致,所以现在我选择在整个API中坚持使用get / set前缀,例如:
class foo {
int GetValue() const;
void SetValue(int value);
void* GetMetadata() const;
void SetMetadata(void* const data);
};
当然,这不符合我想要使用的语言惯例。对整件事情有另一种方法吗?如果是这样,它是什么?我是否坚持使用get / set前缀?
注意:我无法将void*
替换为用户元数据模板,因为API应尽可能稳定。
,我已经为用户字符串提供了一个字符串获取/设置对类型无符号char*
。
更新
仔细(重新)考虑后,我选择坚持使用get / set前缀,我也不会使用void*
的引用 - 如果void*
发出嗅觉,void*&
是几乎是一个公共垃圾填埋场。因此,我基本上选择了类似的东西:
typedef void* Any;
class foo {
...
Any GetObject() const;
void SetObject(Any);
...
};
感谢您的投入。 :)
答案 0 :(得分:3)
并不是说我确定这是最好的设计,而是坚持这样的问题:如果,对于类型为“int”的属性,你写道:
int& Value(); //Used as setter
int Value()const; //Used as getter
对“void *”类型的属性执行相同的操作:
void*& Meta(); //Used as setter
void* Meta()const; //Used as getter
答案 1 :(得分:2)
您可以让Metadata
函数返回对指针的引用:
class foo {
int& Value();
const int& Value() const;
void*& Metadata()
const void* const & Metadata() const
};
另一种方法是使用重载:
class foo{
int Value() const;
void Value(int);
void* Metadata() const;
void Metatdata(void*);
};
如果你走这条路线,你也可以让设置者返回旧值以方便。