Обобщённый указатель на функцию как параметр
От: Molchalnik  
Дата: 07.09.17 21:43
Оценка:
Коллеги, подскажите, можно ли избавится от первого параметра шаблона?
#include <utility>
#include <stdio.h>

template <typename T, T> struct FunctionWrapper;

template < typename R, typename ...Args, R (*mf)(Args...)>
struct FunctionWrapper<R (*)(Args...), mf>
{
    static R call( Args &&... args)
    {
        return mf(std::forward<Args>(args)...);
    }
};

int ff() { return 1; }
int main () {
    typedef int (*FunType)();
    int x = FunctionWrapper< FunType, &ff >().call();
    printf("run! %d", x);
    return 0;
}


В идеале было бы добиться чего-то вроде

int ff() { return 1; }
int main () {
    typedef int (*FunType)();
    int x = FunctionWrapper< &ff >().call();
    printf("run! %d", x);
    return 0;
}


Хотелось бы в некоторых контейнерах задавать свои функции хэширования и сравнения не в конструкторе, а прямо в параметрах шаблона. Делать же отдельно функтор, который вызывает уже существующую функцию, в напряг.
template templates sfinae шаблоны шаблон функция указатель
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.