缩短 boost::function

Shortening boost::function

boost::function 作为参数传递给另一个函数(回调)时,此函数的签名可能会变得很长。

示例:
考虑这个 boost::function:

boost::function<MyClass * (
      TypeA param1,
      TypeB param2,
      TypeC param3,
      TypeD param4,
      TypeE param5,
      TypeF param6)> CreateMyClass;

现在,如果我们将此 boost::function 作为函数参数传递,使用它的函数的签名将变得非常长且难以阅读:

void myFunctionUsingTheCallack(boost::function<MyClass * (
          TypeA param1,
          TypeB param2,
          TypeC param3,
          TypeD param4,
          TypeE param5,
          TypeF param6)> the_callback);

我是不是漏掉了什么? 有什么技巧可以缩短myFunctionWithTheCallack的签名吗?

你为什么不 typedef 一个更短的名字?

typedef boost::function<MyClass * (
  TypeA param1,
  TypeB param2,
  TypeC param3,
  TypeD param4,
  TypeE param5,
  TypeF param6)> Fun;

Fun CreateMyClass;

void myFunctionUsingTheCallack(Fun the_callback);

如果您使用的是 C++11 或更高版本,则可以使用 using 而不是 typedef:

using Fun = boost::function<MyClass * (
  TypeA param1,
  TypeB param2,
  TypeC param3,
  TypeD param4,
  TypeE param5,
  TypeF param6)>;

除了显式指定类型之外,您还可以使用函数模板并让编译器推导类型:

template <typename Fun>
void myFunctionUsingTheCallack(Fun the_callback);

另一个选择,在@m.s 发布的两个之上。 (使用具体的 API 来获取类型):

// defined elsewhere:
void some_api(TypeA param1,
    TypeB param2,
    TypeC param3,
    TypeD param4,
    TypeE param5,
    TypeF param6);

using native_callback_t = decltype(&some_api);
void myFunctionUsingTheCallack(std::function<native_callback_t> callback);