Có nhiều cách để lưu trữ các chức năng, vấn đề là, để có thể gọi hàm với đối số bạn muốn, bạn phải biết gọi chữ ký của hàm anyways và nếu bạn có thông tin đó, bạn cũng có thể sử dụng các bản đồ riêng biệt hoặc sử dụng đối tượng phức tạp hơn hàm boost ::.
Nếu bạn sẵn sàng để làm một chút công việc và có một số hữu hạn các chữ ký, bạn chỉ có thể làm điều gì đó như thế này:
class MultiFunc
{
protected:
MultiFunc() {}
public:
typedef void (*stringFunc)(const std::string&);
typedef void (*intFunc)(int);
static MultiFunc *Create(stringFunc function);
static MultiFunc *Create(intFunc function);
virtual void operator()(const string &) { throw exception(); }
virtual void operator()(int) { throw exception(); }
virtual ~MultiFunc();
};
class MultiFuncString : public MultiFunc
{
private:
stringFunc Function;
public:
MultiFuncString(stringFunc function) : Function(function) {}
virtual void operator()(const string &arg) { Function(arg); }
};
class MultiFuncInt : public MultiFunc
{
private:
intFunc Function;
public:
MultiFuncInt(intFunc function) : Function(function) {}
virtual void operator()(int arg) { Function(arg); }
};
MultiFunc *MultiFunc::Create(MultiFunc::stringFunc function)
{
return new MultiFuncString(function);
}
MultiFunc *MultiFunc::Create(MultiFunc::intFunc function)
{
return new MultiFuncInt(function);
}
void func1(const std::string& s)
{
std::cout << s << std::endl;
}
void func2(int me)
{
std::cout << me << std::endl;
}
int main()
{
map<string, MultiFunc *> a_map;
a_map["func1"] = MultiFunc::Create(&func1);
(*a_map["func1"])("Hello");
a_map["func2"] = MultiFunc::Create(&func2);
(*a_map["func2"])(3);
// Remember to delete the MultiFunc object, or use smart pointers.
}
đầu ra này:
Hello
3
Thật không may, bạn không thể tạo các chức năng ảo được tạo khuôn mẫu hoặc bạn dễ dàng khái quát hóa tất cả điều này.
Giả sử bạn có thể lưu trữ các giá trị và chức năng trong bản đồ, làm thế nào mà bạn muốn truy cập để lập bản đồ các yếu tố? – bayda