如何正确交换 std::function 多次?

How to correctly swap std::function multiple times?

下面的代码试图交换一些 std::function 变量但失败了。特别是 next_read_ 接受 初始化为的其他值。

如何以 next_index_path_empty_ 以及 read_ 和 [ 交换的方式更改此函子=19=]?目标是遍历所有私有方法。

#include <string>
#include <functional>
#include <iostream>
#include <vector>
#include <algorithm>

class Envs {
public:
    Envs()
      : empty_(std::bind(&Envs::empty,this,std::placeholders::_1))
      , path_(std::bind(&Envs::path,this,std::placeholders::_1))
      , index_(std::bind(&Envs::index,this,std::placeholders::_1))
      , next_(path_)
      , read_(index_) {
    }
    void operator()(std::string const & _arg) {
        read_(_arg);
        std::swap(next_,read_);
    }
private:
    void empty(std::string const & _empty) {
        std::cout << "empty: " <<_empty << "\n";
    }
    void path(std::string const & _path) {
        std::cout << "path: " << _path << "\n";
        std::swap(next_,empty_);
    }
    void index(std::string const & _index) {
        std::cout << "index: " <<_index << "\n";
        std::swap(next_,path_);
    }
    std::function<void(std::string const &)> empty_;
    std::function<void(std::string const &)> path_;
    std::function<void(std::string const &)> index_;
    std::function<void(std::string const &)> next_;
    std::function<void(std::string const &)> read_;
};

int main(int argc, char ** argv) {
    std::vector<std::string> args = {"A","B","C"};
    Envs envs;
    std::for_each(args.begin(),args.end(),envs);
}

问题在于您将 envs 对象传递给 std::for_each 函数的方式。因为它被复制了,所以 bind 对象中的 this 指针也被复制了,这基本上意味着你正在操作其他对象中的方法。

正在替换:

Envs envs;
std::for_each(args.begin(),args.end(),envs);

有:

std::for_each(args.begin(),args.end(), Envs());

应该有帮助。