автоматическое определение параметров в шаблоне класса

Рейтинг: 2Ответов: 2Опубликовано: 11.01.2023

пытаюсь спроектировать шаблонный класс который хранит унарную функцию(указатель на неё) с его типом аргумента и типом выходного параметра. Затем пытаюсь создать объект данного класса с использованием определённой унарной функции(см. исходник). Всё то вроде бы и удалось, но аппетиты выросли. хотелось бы доработать (возможно класс или что-то ещё) чтобы он уже не требовал параметры шаблона. Ведь скажем функция std::ptr_fun умеет.

#include <iostream>


template <typename arg0, typename res0>
struct F1 {
    typedef arg0 arg;
    typedef res0 res;
    typedef arg(*func)(res x);
    func f;
    F1(func _f) : f(_f) {}
    res0 operator()(arg0 x) { return f(x); }

};
char foo(int u) { return 's'; }





template<typename arg0, typename res0>
F1<arg0, res0> F1_func(typename F1<arg0, res0>::func _func) {
    return F1<arg0, res0>(_func);
}


int main() { 

    auto F1 = F1_func<char,int>(foo);

}

то есть хочется чтобы работало и как-то так :

int main() { 
    auto F1 = F1_func(foo);
}

Ответы

▲ 7Принят

А если так написать, вам годится?

template<typename arg0, typename res0>
F1<arg0, res0> F1_func( arg0(*_func)(res0)) {
    return F1<arg0, res0>(_func);
}

Вы же передаете указатель на функцию, а не структуру...

▲ 2

Промежуточная функция F1_func не нужна, в актуальной версии С++ параметры шаблона выводятся из аргументов конструктора.

#include <iostream>

template <typename arg0, typename res0>
struct F1
{
    typedef arg0 arg;
    typedef res0 res;
    typedef arg(*func)(res x);
    func f;
    F1(func _f) : f(_f) {}
    res0 operator()(arg0 x) { return f(x); }
};

char foo(int u) { return 's'; }

int main()
{ 
    F1 f1{foo};
}

online compiler