Tôi muốn ánh xạ chuỗi thành một hàm thành viên thể hiện và lưu trữ từng ánh xạ trong bản đồ.Con trỏ của cửa hàng vào chức năng thành viên trong bản đồ
Cách làm sạch sẽ như thế nào?
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;
}
}
cho tôi biết nếu bạn thấy vấn đề với cách tiếp cận này và thành ngữ phổ biến cho điều đó là gì?
Có lẽ, tôi nên sử dụng if-else-nếu chuỗi tuyên bố, cho rằng tôi có một số hạn chế về chức năng thành viên, thay vì một bản đồ khó hiểu của con trỏ func
BTW, tôi thấy một số hữu ích Thông tin ở đây c++-faq-lite
Thực ra tôi nghĩ bản đồ đẹp hơn một chuỗi nếu khác. Nó cung cấp cho bạn một móc tốt để lưu trữ các siêu thông tin khác sau này nếu cần phát sinh - chỉ cần mở rộng kiểu giá trị từ con trỏ hàm tới một cấu trúc chứa con trỏ hàm cộng với bất kỳ thông tin nào khác bạn cần. –
Tôi đồng ý, có vẻ tốt hơn, mặc dù khó hiểu hơn đối với nhà phát triển ít kinh nghiệm hơn. –