[英]Lambda function to call member function that has access to class members
之前问过这个但没有得到答案。 清理示例代码并删除所有Qt。 现在我要实现的是一个通过命令字符串调用并分支到适当功能的函数,而不是像
if ( str == "Task1" ) task1(); // QString if anyone wonders about the == :)
else if( str == "Task2" ) ) task2();
// and so on
我想将调用函数放在has中,并通过简单的哈希查找来调用它们。 它在调用函数时起作用,但似乎没有成员访问权限。 下面的代码打印出来
任务1:0
任务2:0
那是预期的行为吗?
如果是,我如何使它工作?
#include "stdafx.h"
#include <map>
#include <string>
#include <functional>
#include <iostream>
#include <vector>
using namespace std;
struct MyClass
{
MyClass() {
m_functions.insert( pair<string, function<void()> >( string( "Task1" ), function<void()>( [this]() { task1(); } ) ) );
m_functions.insert( pair<string, function<void()> >( string( "Task2" ), function<void()>( [this]() { task2(); } ) ) );
}
map<string, function<void()> >m_functions;
int m_memberValue = 0;
void callFunc( string key )
{
m_memberValue = 42;
auto func = m_functions.find( key );
if ( func != m_functions.end() )
{
func->second();
}
}
void task1()
{
cout << "task1: " << m_memberValue << endl;
}
void task2()
{
cout << "task2: " << m_memberValue << endl;
}
};
int main()
{
MyClass object1;
MyClass object2;
vector<MyClass>objects;
objects.push_back( object1 );
objects.push_back( object2 );
objects[0].callFunc( string( "Task1" ) );
objects[1].callFunc( string( "Task2" ) );
string str;
getline( cin, str );
return 0;
}
初始化object1
和object2
, m_functions
包含lambda, m_functions
lambda包含this
的引用。 一切正常,直到现在。 但是,当您将对象推入std::vector
, m_functions
也会被复制,并带有对原始对象的引用!
当你调用callFunc
每个向量元素上,所述m_memberValue
向量元素被更新,但随后task1
(和task2
)从原始对象, object1
和object2
,被调用。 因为你从来没有所谓callFunc
上object1
或object2
, m_memberValue
是0
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.