【问题标题】:c++: std::vector of std::function with arbitrary signaturesc++: 带有任意签名的 std::function 的 std::vector
【发布时间】:2012-05-12 15:28:08
【问题描述】:

是否可以创建一个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));

【问题讨论】:

  • 参数将被预先绑定
  • 我可能会看到这适用于可变参数模板,但我无法提供代码。
  • 你的意思是同一个向量中有多个签名吗?或者你只是在写一个通用算法。如果是后者,您可以使用模板来实现。
  • @Als 我用收到的错误消息编辑了问题
  • 不要描述代码。引用它。

标签: c++ function vector


【解决方案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]();
}

你做得怎么样?

【讨论】:

  • 如果返回类型不同怎么办?
【解决方案2】:

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

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

是的,您可以将一堆具有相同类型的项目存储在一个向量中。


或者您可能想问“我如何包装可调用对象以使它们具有我需要的类型?”

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-26
    • 1970-01-01
    • 1970-01-01
    • 2014-05-24
    • 2019-04-23
    相关资源
    最近更新 更多