如何正确交换 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());
应该有帮助。
下面的代码试图交换一些 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());
应该有帮助。