C++ std :: vector作为std :: function的参数

CMi*_*lby 0 c++ function vector

我试图用C++进行回调.回调的参数是通过引用传递的向量.问题是当我调用函数时,向量总是为空.要证明这一点,请参阅下面的程序.

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 );
}
Run Code Online (Sandbox Code Playgroud)

这是我能做的最接近的例子.我已将回调保存在地图中.然后我将函数添加到地图中.然后我制作一个通用的TestStruct并将它放在我的参数中.最后我调用该函数,它应该打印出"1,2",但没有打印.

当我调试它时,它说参数是空的.这让我相信我做错了或者说这是不可能的.

那么这里出了什么问题?非常感谢任何帮助或提示.谢谢.

Bar*_*rry 5

当你写:

map[ "test1" ] = std::bind( &TestFunction, vect );
Run Code Online (Sandbox Code Playgroud)

这给你一个nullary函数,当被调用时,它会给你结果TestFunction(vect).您绑定荷兰国际集团vect到的第一个参数TestFunction.因此,当你调用它时,你打印的是什么vect(空的)而不是params(不是)的结果.

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

map[ "test1" ] = TestFunction;
Run Code Online (Sandbox Code Playgroud)

你会认为这不会编译.毕竟,你想要一个带参数的函数,但你给它一个不带参数的函数.但是bind()简单地忽略它不使用的所有参数.