缩短boost :: function

时间:2015-08-11 10:34:52

标签: c++ boost boost-bind c++98 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的签名?

2 个答案:

答案 0 :(得分:5)

为什么不让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);

答案 1 :(得分:0)

另一种选择,在@ 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);