gpt4 book ai didi

c++ - 在映射中存储指向成员函数的指针

转载 作者:可可西里 更新时间:2023-11-01 17:55:29 26 4
gpt4 key购买 nike

我想将字符串映射到实例成员函数,并将每个映射存储在映射中。

做这样的事情的干净方法是什么?

class  MyClass
{
//........
virtual double GetX();
virtual double GetSomethingElse();
virtual double GetT();
virtual double GetRR();
//........
};


class Processor
{
private:
typedef double (MyClass::*MemFuncGetter)();
static map<std::string, MemFuncGetter> descrToFuncMap;

public:
static void Initialize();
void Process(Myclass m, string);
};

void Processor::Initialize()
{

descrToFuncMap["X"]=&MyClass::GetX;
descrToFuncMap["SomethingElse"]=&MyClass::GetSomethingElse;
descrToFuncMap["RR"]=&MyClass::GetRR;
descrToFuncMap["T"]=&MyClass::GetT;
};
void Processor::Process(MyClass ms, const std::string& key)
{
map<std::string, Getter>::iterator found=descrToFuncMap.find(key);
if(found!=descrToFuncMap.end())
{
MemFuncGetter memFunc=found->second;
double dResult=(ms).*memFunc();
std::cout<<"Command="<<key<<", and result="<<result<<std::end;
}
}

如果您发现这种方法有问题,请告诉我,常见的习语是什么?

或许,我应该使用 if-else-if 语句链,因为我的成员函数数量有限,而不是困惑的 func 指针映射

顺便说一句,我在 c++-faq-lite 中找到了一些有用的信息

最佳答案

对我来说看起来不错,但事实上 descrToFuncMap 需要声明为 static 如果您打算从静态函数 Initialize() 中初始化它

如果您想确保 Initialize() 被调用,并且只被调用一次,您可以使用单例模式。基本上,如果你不做多线程,那只是意味着用调用 Initialize() 。然后,将 FuncMap 类型的 static 局部变量添加到 Processor::Process() - 因为该变量是 static,它会持续存在并且只初始化一次。

示例代码(我现在意识到 friend 在这里并不是必需的):

class Processor {
private:
typedef double (MyClass::*MemFuncGetter)();

class FuncMap {
public:
FuncMap() {
descrToFuncMap["X"]=&MyClass::GetX;
descrToFuncMap["SomethingElse"]=&MyClass::GetSomethingElse;
descrToFuncMap["RR"]=&MyClass::GetRR;
descrToFuncMap["T"]=&MyClass::GetT;
}

// Of course you could encapsulate this, but its hardly worth
// the bother since the whole class is private anyway.
map<std::string, MemFuncGetter> descrToFuncMap;
};

public:
void Process(Myclass m, string);
};

void Processor::Process(MyClass ms, const std::string& key) {
static FuncMap fm; // Only gets initialised on first call
map<std::string, Getter>::iterator found=fm.descrToFuncMap.find(key);
if(found!=fm.descrToFuncMap.end()) {
MemFuncGetter memFunc=found->second;
double dResult=(ms).*memFunc();
std::cout<<"Command="<<key<<", and result="<<result<<std::end;
}
}

这不是“真正的”单例模式,因为不同的函数可以创建它们自己的、单独的 FuncMap 实例,但这足以满足您的需要。对于“真正的”单例,您可以将 FuncMap 的构造函数声明为私有(private)并添加一个静态方法,比如 getInstance(),它将唯一实例定义为static 变量并返回对该变量的引用。 Processor::Process() 然后将其与

一起使用
FuncMap& fm = FuncMap::getInstance();

关于c++ - 在映射中存储指向成员函数的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/630920/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com