История изменений
Исправление fluorite, (текущая версия) :
Дедушка, авто и шаблоны — ортогональные вещи.
template <class F> struct ArgType;
template <class R, class T>
struct ArgType<R (*)(T)> {
typedef T argument_type;
};
struct CppFunction {
static double call(double a, double b, double c) { return a * b * c; }
};
struct T1 {
static double call(int a) { return static_cast<double>(a); }
};
template <typename Function, typename... T>
auto wrap(typename ArgType<decltype(&T::call)>::argument_type... args)
-> decltype(Function::call(T::call(args)...)) {
return Function::call(T::call(args)...);
}
auto& wrappedFunction = wrap<CppFunction, T1, T1, T1>>
Исправление fluorite, :
Дедушка, авто и шаблоны — ортогональные вещи.
template <class F> struct ArgType;
template <class R, class T>
struct ArgType<R (*)(T)> {
typedef T argument_type;
};
struct CppFunction {
static double call(double a, double b, double c) { return a * b * c; }
};
template <typename Function, typename... T>
auto wrap(typename ArgType<decltype(&T::call)>::argument_type... args)
-> decltype(Function::call(T::call(args)...)) {
return Function::call(T::call(args)...);
}
auto& wrappedFunction = wrap<CppFunction, T1, T1, T1>>
Исходная версия fluorite, :
Дедушка, авто и шаблоны — ортогональные вещи.
struct cppFunction {
static double call(double a, double b, double c) { return a * b * c; }
};
template <typename Function, typename... T>
auto wrap(typename ArgType<decltype(&T::call)>::argument_type... args)
-> decltype(Function::call(T::call(args)...)) {
return Function::call(T::call(args)...);
}
auto wrappedFunction = &wrap<CppFunction, T1, T1, T1>>