Вы можете создать тип Callable
для функций, которые принимают различные типы аргументов, а затем сохранить его в vector
(используя здесь вектор для простоты):
struct Callable {
Callable(std::function<void()> f) : zero_(std::move(f)) {}
Callable(std::function<void(int)> f) : one_(std::move(f)) {}
void operator()() { zero_(); }
void operator()(int x) { one_(x); }
std::function<void()> zero_;
std::function<void(int)> one_;
};
//vector of methods
std::vector<Callable> methods;
Чтобы сохранить метод , вы можете использовать функцию в формате template
или просто использовать перегрузки. Я использую здесь перегрузки:
void addMethod(std::function<void()> func)
{
methods.push_back(Callable(func));
}
void addMethod(std::function<void(int)> func)
{
methods.push_back(Callable(func));
}
А затем, чтобы наконец вызвать функцию:
template<typename ...Args>
void callMethod(int idx, Args ...args) {
auto method = methods[idx];
method(std::forward<Args>(args)...);
}
Main:
int main()
{
addMethod([](int x){
std::cout << "I am function(int)" << x << '\n';
});
addMethod([](){
std::cout << "I am just function()\n";
});
callMethod(0, 200);
callMethod(1);
}
Это самый простой из возможных способов. можно придумать, чтобы добиться этого. Это могут быть способы получше, и мне действительно интересно.
Попробуйте здесь: https://godbolt.org/z/HS5a7p