记录std :: function参数的最佳实践

时间:2015-07-09 16:35:00

标签: c++

使用std::function声明类型时,我发现我错过了能够为模板参数指定参数名称。例如,我发现这个普通的函数指针类型声明:

typedef void (*ArcCallback)(
  void *object, 
  double x_start, double y_start, 
  double x_finish, double y_finish, 
  double x_center, double y_center, 
  bool counterclockwise);

比这个std::function类型声明更具可读性:

typedef std::function<void(
  void *,
  double, double,
  double, double,
  double, double,
  bool)> ArcCallback;

尽管使用std::function会带来灵活性(例如,能够分配lambda或std::bind调用的结果),但我会错过参数名称。当然我可以在std::function声明中添加注释,但结果很笨拙。更重要的是,我不认为IDE会使用这些注释来提供参数提示。

其他有经验的C ++从业者如何向std::function记录模板参数的用途?广泛使用的库是否存在大量使用此类类型的先例?

2 个答案:

答案 0 :(得分:5)

对于这个特定的代码,问题并不是std::function没有很好的方法来记录参数,问题是8个参数对于 any 来说可能太多了功能。引入其他类型可以大大有助于清理它。

typedef void* CallbackObject;

struct Point {
  double x;
  double y;
};

enum CircularDirection {
  CLOCKWISE,
  COUNTERCLOCKWISE
};

struct ArcCallbackParam {
  CallbackObject object;
  Point start;
  Point finish;
  Point center;
  CircularDirection direction;
};

typedef std::function<void(const ArcCallbackParam&)> ArcCallback;

修改:我意识到这并不能直接回答您的问题。要回答你的问题,我不知道任何&#34;解决方案&#34;除了评论参数,但添加类型和typedef可以帮助很多。

答案 1 :(得分:4)

原始ArcCallback typedef中的参数名称仅用于自我记录目的。由于您习惯使用“冗余”参数名称进行自我记录,为什么不在std::function情况下做同样的事情?

typedef std::function<void (
  void *object, 
  double x_start, double y_start, 
  double x_finish, double y_finish, 
  double x_center, double y_center, 
  bool counterclockwise)> ArcCallback;

该语言不禁止这样做。