属性函数样式约定受void *影响

时间:2009-10-20 20:17:15

标签: c++ api naming-conventions

我正在用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);
  ...
};

感谢您的投入。 :)

2 个答案:

答案 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*);
};

如果你走这条路线,你也可以让设置者返回旧值以方便。