Ci sono modi per memorizzare le funzioni, il problema è che, per poter chiamare la funzione con l'argomento desiderato, dovresti conoscere il chiamare comunque la firma della funzione, e se si dispone di tali informazioni, si potrebbe anche utilizzare mappe separate o utilizzare un oggetto più complicato di boost :: function.
Se siete disposti a fare un po 'di lavoro e hanno un numero finito di firme, si può solo fare qualcosa di simile:
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.
}
Questo uscite:
Hello
3
Purtroppo, non puoi creare funzioni virtuali basate su modelli o puoi facilmente generalizzare tutto questo.
supponga è possibile memorizzare i valori e le funzioni nella cartina, come si desidera l'accesso di mappare elementi? – bayda