【问题标题】:Shortening boost::function缩短 boost::function
【发布时间】:2015-08-11 10:34:52
【问题描述】:

当将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的签名吗?

【问题讨论】:

  • 请指定您使用的c++版本
  • 我使用的是 C++98。已添加标签。谢谢。

标签: c++ boost boost-bind c++98 boost-function


【解决方案1】:

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

【讨论】:

  • 您应该添加using 版本,只是为了将来读者的完整性。
【解决方案2】:

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

【讨论】:

  • 这需要 C++11,而 可能 不可用,否则为什么 OP 会使用 boost::function
  • @m.s.有些人什么都用boost,想知道为什么没有boost::vector
猜你喜欢
  • 1970-01-01
  • 2011-02-28
  • 2016-03-16
  • 2012-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多