如何在模板没有特定大小写的情况下存储 std::bind 的向量?

How do I store a vector of std::bind without a specific case for the template?

std::bind 上完成 后,我想知道是否可以保留 std::bind 创建的 vector 函数,这样我就可以避免使用std::function 及其重量级包装。

#include <iostream>
#include <functional>
#include <typeinfo>
#include <vector>

int add(int a, int b) {return a + b;}

int main() {

    //I believe this here is just a special type of bound function.
    auto add2 = std::bind(add, std::placeholders::_1, 2);
    auto add3 = std::bind(add, std::placeholders::_1, 3);

    //Yup.
    std::cout << typeid(add2).name() << std::endl;
    //Here's the type of the second function
    std::cout << typeid(add3).name() << std::endl;

    //Is there a nicer way to do this?
    std::vector<decltype(std::bind(add, std::placeholders::_1, 1))> vec;

    return 0;   
}

虽然可以创建 std::bind 函数的向量,但有没有一种方法我不必提供绑定函数的特定情况来声明没有 [=23 的容器=] 由 std::bind?

生成的函数类型

这个怎么样?

#include <iostream>
#include <functional>
#include <vector>

int add(int a, int b) { return a + b; }

using bound_add_t = decltype(std::bind(add, std::placeholders::_1, int()));

int main() {
  std::vector<bound_add_t> vec;
  vec.emplace_back(add,std::placeholders::_1, 1);
  vec.emplace_back(add,std::placeholders::_1, 2);
  vec.emplace_back(add,std::placeholders::_1, 3);

  for (auto &b : vec)
    std::cout << b(5) << std::endl;

  return 0;   
}

所以,这似乎是不可能的——std::bind 似乎没有正常的 nameable/explicit 类型——该类型通常是根据绑定的签名生成的功能,并且似乎无法指定。使用 std::function 似乎是包装 std::bind 函数并将它们存储在向量中的唯一方法。

Even for lambdas, this doesn't seem possible--使用 std::function 形式的包装器似乎是首选答案,尽管结果函数对象的大小增加了。

可能的替代方案可能是存储 Functor 旨在模拟闭包的对象与带有类型检查层的通用对象(尽管这看起来很重)。无论如何,使用 std::function 似乎是最干净的解决方案。