2016-05-25 9 views
3
template<typename T> 
void f(void (*func)(const T&)) { 
    (*func)(T()); 
} 

void func(const int& i) { 
    std::cout << i << std::endl; 
} 

int main() { 
    f(&func); 
} 

Здесь аргумент шаблона T (= int) из f автоматически вычтена на основе первого аргумента функции func.C++ тип аргумента для аргументов шаблона дедукции

Может ли это быть расширено для работы с общими функторами (функциями лямбды или другими функциональными объектами.) Возможно, со второй функцией, то есть что-то вроде

template<typename T, typename Function> void f(Function func); 

template<typename Function> 
void call_f(Function func) { 
    using arg_type = first_argument_type_t<Function>; // ??? 
    f<arg_type, Function>(func); 
} 

Падения на func в f должно быть в состоянии быть встроенный компилятором, поэтому std::function не может быть использован.

+0

Для вывода типа аргумента существует множество случаев. –

+0

Вы не будете делать это в общем случае, т. Е. Если этот функтор является общей лямбда или экземпляром класса с перегруженным/templated 'operator()' –

ответ

1

Я обычно использую функциональные черты кода, как this (GPL-3 лицензированной), чтобы сделать это:

template <typename F> 
using first_argument_type_t = 
    typename sharemind::FunctionTraits<F>::template argument<0u>::type; 

Но есть также Boost function_traits альтернатива, которая может помочь.