?
, , . , ++ , (. ++). . ++ Bjarne Stroustroup .
(.. Base*), ( ):
#include <iostream>
class DerivedA //: public Base
{
public:
void execute(int i)
{
std::cout << "I'm DerivedA::execute(int)! " << std::endl;
}
};
class DerivedB //: public Base
{
public:
void execute(int i, float f)
{
std::cout << "I'm DerivedB::execute(int, float)! " << std::endl;
}
};
template<typename Class, typename... Args>
void execInvoker(Class* obj, Args... args)
{
static_cast<Class*>(obj)->execute(std::forward<Args>(args)...);
}
int main(int argc, char* argv[])
{
DerivedA a;
DerivedB b;
int i = 5;
float f = 5.2f;
execInvoker(&a, i);
execInvoker(&b, i, f);
}
, execute, ( ). g++ 4.6, :
$ g++ -std=c++0x -Wall variadic.cpp
$ ./a.out
I'm DerivedA::execute(int)!
I'm DerivedB::execute(int, float)!
, - .
template<typename Class>
class Proxy
{
private:
Class* obj;
public:
Proxy(Class* _obj) : obj(_obj) {}
template<typename... Args>
void execute(Args... args)
{
obj->execute(std::forward<Args>(args)...);
}
};
:
Proxy<DerivedA> proxy(&a);
proxy.execute(i);
, - , :
template<typename Class>
void proxyUser(Proxy<Class>& p)
{
p.execute(4, 0.3f);
}
execute. .