Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用于重载的泛型类成员函数_C++_C++11_Lambda - Fatal编程技术网

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();
}