1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
|
#include <sstream>
#include <complex>
#include <iostream>
class FunctionBase
{
public :
virtual ~FunctionBase() {}
virtual std::string execute(const std::string ¶ms) = 0;
};
namespace Private
{
template<class... Args>
class AFaire
{
};
template<class ArgsAFaire, class ReturnType, class... ArgsTypes>
class ExecuteImpl;
template< class ReturnType, class... ArgsTypes>
struct ExecuteImpl< AFaire<>, ReturnType, ArgsTypes... >
{
template<class... ArgsFaits>
static ReturnType exec(std::istringstream& stream, ReturnType (*function)(ArgsTypes...), ArgsFaits... faits)
{
return function(faits...);
}
};
template<class Actuel, class... ArgsAFaire, class ReturnType, class... ArgsTypes>
struct ExecuteImpl< AFaire<Actuel, ArgsAFaire...>, ReturnType, ArgsTypes... >
{
template<class... ArgsFaits>
static ReturnType exec(std::istringstream& stream, ReturnType (*function)(ArgsTypes...), ArgsFaits... faits)
{
Actuel actuel;
stream >> actuel;
return ExecuteImpl< AFaire<ArgsAFaire...>, ReturnType, ArgsTypes... >::exec(stream, function, faits..., actuel);
}
};
}
template <typename ReturnType, typename... ArgsTypes>
class Function : public FunctionBase
{
public:
Function( ReturnType (*f)(ArgsTypes...) ) : m_function(f) {}
virtual std::string execute(const std::string ¶ms)
{
std::istringstream iss(params);
ReturnType ret = Private::ExecuteImpl<Private::AFaire<ArgsTypes...>, ReturnType, ArgsTypes... >::exec(iss, m_function);
std::ostringstream oss;
oss << ret;
return oss.str();
}
private:
ReturnType (*m_function)(ArgsTypes...);
};
std::complex<int> foo(int i, char txt)
{
std::cout << txt << std::endl;
return std::complex<int>(i,i);
}
int main(void)
{
Function<std::complex<int> , int, char> func(&foo);
FunctionBase& base = func;
std::cout << base.execute("5 a") << std::endl;
} |
Partager