使用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
记录模板参数的用途?广泛使用的库是否存在大量使用此类类型的先例?
答案 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;
该语言不禁止这样做。