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

Posted

技术标签:

【中文标题】C++ std::vector 作为 std::function 的参数【英文标题】:C++ std::vector as Parameter for std::function 【发布时间】:2016-02-28 17:42:47 【问题描述】:

我正在尝试在 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 );

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

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

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

【问题讨论】:

你想绑定std::placeholders::_1,而不是vect,即std::bind( &amp;TestFunction, std::placeholders::_1);,或者实际上,map[ "test1" ] = &amp;TestFunction; 就足够了(没有bind @Piotr 打败了我。 cplusplus.com/reference/functional/bind 见那里的例子。 【参考方案1】:

当你写作时:

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

这给了你一个空函数,当它被调用时,给你TestFunction(vect)的结果。您正在绑定vectTestFunction 的第一个参数。因此,当您调用它时,您打印的是 vect(为空)中的结果,而不是 params(不是)中的结果。

这根本不是你想要的——你想要的是实际功能TestFunction

map[ "test1" ] = TestFunction;

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

【讨论】:

【参考方案2】:

您不需要将bind TestFunction 与一个空的vector。您可以直接将其添加到地图中。

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

【讨论】:

以上是关于C++ std::vector 作为 std::function 的参数的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Python 列表在 C++ 中使用 SWIG 分配 std::vector?

将 std::vector 作为 numpy 数组返回给 python

C++随机选择std::vector的非空元素<std::vector>>

C++:使用 OpenMP 插入 std::vector

将元素从 std::vector 复制到 std::stack c++

包装 std::vector 的 std::vectors,C++ SWIG Python