c ++:带有任意签名的std :: function的std :: vector

时间:2012-05-12 15:28:09

标签: c++ function vector

是否可以创建一个可以容纳std::vector任何签名的std::function? (函数参数都将被预先绑定。)

我尝试std::vector<std::function<void()> >,因为如果我只有一个std::function的类型,我可以将任何函数绑定到它。

这在矢量中似乎不起作用:如果我尝试将std::bind的函数添加到具有void()以外的签名的矢量,我得到:

No matching member function for call to 'push_back'

有办法做到这一点吗?

修改

我只记得std::function<void()>允许你绑定任何返回void的函数,只要参数与std::bind预先绑定,它就不允许你绑定任何函数虽然签名,但为了我的目的它足够通用,所以以下工作:

class A
{
public:
    void test(int _a){ return 0; };
};

A a;
std::vector<std::function<void()> > funcArray;
funcArray.push_back(std::bind(&A::test, std::ref(a), 0));

2 个答案:

答案 0 :(得分:11)

这应该有效:

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

void hello() { std::cout << "Hello\n"; }
void hello2(const char * name) { std::cout << "Hello " << name << '\n'; }

int main()
{

    std::vector<std::function<void()>> v;
    v.push_back(hello);
    v.push_back(std::bind(hello2, "tim"));
    v[0]();
    v[1]();
}

你是怎么做到的?

答案 1 :(得分:0)

  

是否可以创建一个std :: vector,它可以保存带有任何签名的std :: function? (函数参数都将被预先绑定。)

所以你想知道你是否可以使用向量来保存不同类型的对象,除非你把它们全部包装在一个类型中?

是的,你可以存储一堆在矢量中具有相同类型的项目。


或许您可能会问“如何将可调用对象包装起来以便它们具有我需要的类型?”

bind可以处理特殊情况,您只需要删除或重新排序参数,以获得可转换为公共类型的内容。为了处理您可能需要选择返回类型,添加参数等的一般情况,您只需编写新函数即可。 Lambda可以很容易地实现内联:

std::vector<std::function<common_signature> F;

double foo(std::string);
// for a common signature of void()
F.push_back([]{ foo("hello"); });

int bar(void);
// for a common signature of int (int)
F.push_back( [](int i) { return bar() + i; });

int baz(void);
// for a common signature of std::complex<double> (void)
F.push_back( []() -> std::complex<double> { return {0,baz()}; });