c++ - 使用 std::function 进行模板类型推导

标签 c++ templates c++11 std-function

我发现了 std::function 和类型推导的以下行为,这对我来说是出乎意料的:

#include <functional>

template <typename T>
void stdfunc_test(std::function<T(T)> func) {};

int test_func(int arg)
{
    return arg + 2;
}

int main()
{
    stdfunc_test([](int _) {return _ + 2;});
    stdfunc_test(test_func);
}

main 中的两行都会导致错误:

no instance of function template "stdfunc_test" matches the argument list

尝试在 Visual Studio 2015 中编译时。

为什么类型推导不从函数类型中推导模板类型,是否有解决方法?

最佳答案

您可以使用模板来推导函数和仿函数的签名:

#include<functional>

template<class T>
struct AsFunction
    : public AsFunction<decltype(&T::operator())>
{};

template<class ReturnType, class... Args>
struct AsFunction<ReturnType(Args...)> {
  using type = std::function<ReturnType(Args...)>;
};

template<class ReturnType, class... Args>
struct AsFunction<ReturnType(*)(Args...)> {
  using type = std::function<ReturnType(Args...)>;
};


template<class Class, class ReturnType, class... Args>
struct AsFunction<ReturnType(Class::*)(Args...) const> {
  using type = std::function<ReturnType(Args...)>;
};

template<class F>
auto toFunction( F f ) -> typename AsFunction<F>::type {
  return {f};
}

template <typename T>
void stdfunc_test(std::function<T(T)> func) {};

int test_func(int arg)
{
    return arg + 2;
}


int main()
{

    stdfunc_test( toFunction([](int _) {return _ + 2;}) );
    stdfunc_test( toFunction(test_func) );
    return 0;
}

您可以在这里现场试用:http://fiddle.jyt.io/github/d4ab355eb2ab7fc4cc0a48da261f0127

关于c++ - 使用 std::function 进行模板类型推导,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39173519/

相关文章:

具有动态回调函数类型的 C++ 模板类

c++ - 使用策略模板类工厂创建策略模板类?

c++ - 具有嵌套类的模板 LinkedList 类

c++ - vector 和列表的 end() 迭代器的语义

c++ - 如何解决 g++ 问题 "internal compiler error: Illegal instruction min() _GLIBCXX_USE_NOEXCEPT { return __FLT_MIN__; }"?

C++ 重载输出运算符

c++ - 匿名命名空间

c++ - std::vector emplace 和 std::vector emplace 成对

c++ - 模板化成员函数调用g++错误: no matching function for call

c++ - unsigned long long 的确切大小应该是多少