与 std::bind 相反,为给定参数传入不同的函数

jea*_*luc 13 c++ std stdbind

我有几个具有几乎相同签名的函数(比实际代码短得多):

int hello(A a, B b, C c, int n);
int there(A a, B b, C c, int n);
int how(A a, B b, C c, int n);
int are(A a, B b, C c, int n);
...
Run Code Online (Sandbox Code Playgroud)

等等。然后在调用期间,代码创建一次参数,然后将相同的对象传递给每个函数,除了 n:

A a; B b; C c;
hello(a, b, c, 240);
there(a, b, c, 33);
how(a, b, c, 54);
are(a, b, c, 67);
Run Code Online (Sandbox Code Playgroud)

我想要实现的是类似于std::bind通常使用的东西,除了我想换掉功能。例如:

auto uber_func = std::something_stack_overflow_recommends(..., a, b, c)
uber_func(hello, 240);
uber_func(there, 33);
uber_func(how, 54);
uber_func(are, 67);
Run Code Online (Sandbox Code Playgroud)

从文档中我std::bind不清楚它是否可以做到这一点。你有什么建议吗?

Phi*_*ßen 11

您可以使用std::bind已过时的 Lambda,因为它更易于使用:

  auto uber_func = [&](std::function<int(A, B, C, int)> f, int n) {
    return f(a, b, c, n);
  };

  uber_func(hello, 240);
  uber_func(there, 33);
  uber_func(how, 54);
  uber_func(are, 67);
Run Code Online (Sandbox Code Playgroud)

第一个解决方案强制所有函数都具有相同的众所周知的接口。如果需要,它可以被推广以支持不同类型的功能:

  auto uber_func = [&](auto f, int n) {
    return f(a, b, c, n);
  };
Run Code Online (Sandbox Code Playgroud)

第二种解决方案更通用,避免了第一种解决方案的性能开销。小缺点:它需要一个 C++14 编译器,而第一个应该适用于任何 C++11 编译器。如果那没问题,我更喜欢第二个解决方案而不是第一个。

我意识到你问了怎么做std::bind,我没有回答。然而,由于 C++11 Lambdas 在很大程度上取代了std::bind. 从 C++14 开始,它变得更加清晰,因为添加了进一步的改进。除非严格要求与 C++98 的兼容性,否则我建议避免std::bind使用 Lambdas

  • 我同意,lambda 在各方面似乎都优于 std::bind。谢谢! (2认同)