2016-02-28 291 views
0

我正在尝试在C++中进行回调。回调的参数是一个通过引用传递的向量。问题是当我调用函数时,矢量总是空的。为了演示这一点,请参阅下面的程序。C++ std :: vector作为std :: function的参数

struct TestStruct { 
    int x; 
    int y; 
}; 

void TestFunction(const std::vector<TestStruct> &vect) { 
    for (unsigned int i = 0; i < vect.size(); i++) { 
     printf("%i, %i\n", vect[ i ].x, vect[ i ].y); 
    } 
} 

int main() { 
    std::map<std::string, std::function<void(const std::vector<TestStruct>&)>> map; 

    std::vector<TestStruct> vect; 
    map[ "test1" ] = std::bind(&TestFunction, vect); 
    map[ "test2" ] = std::bind(&TestFunction, vect); 

    std::vector<TestStruct> params; 
    TestStruct t; 
    t.x = 1; 
    t.y = 2; 
    params.emplace_back(t); 

    map[ "test1" ](params); 
} 

这是我所能做的最接近的例子。我已经在地图中保存了回调。然后我将这些函数添加到地图中。然后我制作一个通用的TestStruct并将其放入我的参数中。最后,我打电话给该功能,它应该打印出“1,2”,而不是打印。

当我调试它说它的参数是空的。这导致我相信我做错了什么或者这是不可能的。

那么这里出了什么问题?任何帮助或提示,不胜感激。谢谢。

+1

你想要用'std :: placeholders :: _ 1',而不是'vect',即'std :: bind(&TestFunction,std :: placeholders :: _ 1);',或者实际上'map [ “test1”] =&TestFunction;'应该足够了(没有'bind') –

+0

@Piotr击败了我。 http://www.cplusplus.com/reference/functional/bind/看到那里的例子。 – Matt

回答

4

当你写:

map[ "test1" ] = std::bind(&TestFunction, vect); 

这就给了你一个无参函数,调用它时,让你的TestFunction(vect)结果。你是绑定 ing vect到第一个参数TestFunction。所以当你打电话给它时,你打印的是vect(这是空的)的结果,而不是params(不是)的结果。

那是不是你想要的所有 - 你想要的实际功能TestFunction

map[ "test1" ] = TestFunction; 

你可能会认为这不会编译。毕竟,你需要一个接受参数的函数,但是你给了它一个不带参数的函数。但bind()只是忽略它不使用的所有参数。

1

您并不需要bindTestFunction并且空的vector。您可以直接将其添加到地图。

map[ "test1" ] = TestFunction; 
map[ "test2" ] = TestFunction; 
+0

完美地工作,谢谢! – CMilby