C ++:标准::的std ::矢量任意签名功能(c++: std::vector of std::

2019-06-24 08:50发布

是否有可能创建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));

Answer 1:

这应该工作:

#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]();
}

你是如何做的呢?



Answer 2:

是否有可能创建一个std :: vector的,可容纳一个std ::有任何签名功能? (函数参数都会被预先绑定)。

所以,你想知道如果你可以使用一个向量来保存除非你已经包裹他们都在单一型不同类型的对象?

是的,你可以存储一束都在一个矢量相同类型的项目。


或者,也许你正在试图问“我如何包装可调用的对象,使得他们将有我需要的类型?”

绑定可以处理特殊情况下,你只需要删除或以得到的东西转换为普通型重新排序参数。 为了处理这种情况,您可能需要选择返回类型一般情况下,加个参数,等等,你只需要编写新的功能。 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()}; });


文章来源: c++: std::vector of std::function with arbitrary signatures