C++ 用于重载的泛型类成员函数
我想象了一个场景,在这个场景中,我有一个行为与平常一样的类,但是声明了一些空(成员)函数,可以根据需要使用(类似于重载)。可能吗?怎样才能做到呢 为了让我自己明白,假设我有一个类,它在某个点的构造中使用给定的输入函数C++ 用于重载的泛型类成员函数,c++,c++11,lambda,C++,C++11,Lambda,我想象了一个场景,在这个场景中,我有一个行为与平常一样的类,但是声明了一些空(成员)函数,可以根据需要使用(类似于重载)。可能吗?怎样才能做到呢 为了让我自己明白,假设我有一个类,它在某个点的构造中使用给定的输入函数f(通过下面的过程成员函数) A类{ //建造师 A(常数图和g), 函数f=[](void*){}{ ... } //成员函数 ... 私人: //成员变量 ... //私人成员职能 void进程(void);//此函数将使用输入函数f
f
(通过下面的过程
成员函数)
A类{
//建造师
A(常数图和g),
函数f=[](void*){}{
...
}
//成员函数
...
私人:
//成员变量
...
//私人成员职能
void进程(void);//此函数将使用输入函数f
};
现在,我可以做的是在A
的构造函数中指定函数f
,它将在处理A
的瞬间时使用。使用lambda
函数执行此任务。然而,我希望f
能够使用A
s私有成员,就好像它是A
s定义的一部分一样。能做到吗
提前感谢,,
Nikhil基本技术是让f接受它将处理的正确类型(A的私有成员)的参数,然后在process()函数内将这些参数传递给f。如果有很多函数,那么您需要将f分解为更小的函数,并使process()调用这些更小的函数(当然,还要在构造函数中传入更小的函数)。让
f
引用A
作为参数。提供公共getter和setter,而不是访问A
的私有成员
class A {
public:
A (const Graph& g, std::function <void (void*, A&)> f)
: f_(f)
{}
// getters and setters
private:
std::function<void (void*, A&)> f_;
void process () {
f_(nullptr, *this);
}
};
A类{
公众:
A(常数图和g,标准::函数f)
:f_uf(f)
{}
//接球手和接球手
私人:
std::函数f;
无效过程(){
f_3;(nullptr,*本);
}
};
我不确定这是否是您想要的,但我写了一个可能与您的思路一致的小示例。将privatestuff设置为存储私有变量的结构,您可以一次性发送所有数据
#include <functional>
#include <iostream>
using namespace std;
typedef std::function<void(void*)> DoStuffFunc;
class A
{
public:
A(DoStuffFunc func) {
doStuff = func;
privateStuff = 5;
}
void process() {
doStuff((void*)&privateStuff);
}
private:
int privateStuff;
DoStuffFunc doStuff;
};
void doStuffX(void* data) {
int x = *(int*)data;
cout <<"x: " <<x <<endl;
}
int main(int argc, char** argv) {
DoStuffFunc fX = doStuffX;
A ax(fX);
ax.process();
}
#包括
#包括
使用名称空间std;
typedef std::函数dostuffunc;
甲级
{
公众:
A(Dostuffunc func){
doStuff=func;
私人物品=5;
}
无效过程(){
doStuff((void*)和privateStuff);
}
私人:
私人物品;
Dostuffunc doStuff;
};
void doStuffX(void*数据){
int x=*(int*)数据;
如果他没有提供getter/setter,就不能或使函数成为朋友。
#include <functional>
#include <iostream>
using namespace std;
typedef std::function<void(void*)> DoStuffFunc;
class A
{
public:
A(DoStuffFunc func) {
doStuff = func;
privateStuff = 5;
}
void process() {
doStuff((void*)&privateStuff);
}
private:
int privateStuff;
DoStuffFunc doStuff;
};
void doStuffX(void* data) {
int x = *(int*)data;
cout <<"x: " <<x <<endl;
}
int main(int argc, char** argv) {
DoStuffFunc fX = doStuffX;
A ax(fX);
ax.process();
}