LINUX.ORG.RU

История изменений

Исправление 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>>
Для строгой типизации есть хаскель.