C ++使用函数参数类型进行模板参数推导

时间:2016-05-25 07:49:10

标签: c++ templates c++11 c++14 functor

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的第一个参数自动扣除。

这还可以扩展到使用一般函子(lambda函数或其他函数对象)。可能有第二个函数,例如

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);
}

funcf的下降应该能够由编译器内联,因此无法使用std::function

1 个答案:

答案 0 :(得分:1)

我通常使用像this这样的功能特性代码(GPL-3许可)来做到这一点:

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

但也有Boost function_traits替代方案,可能会有所帮助。