将 std::function 与模板一起使用

Using std::function with templates

所以在最精炼的形式中,我有这样的事情发生,

template <class T>
bool f(const T &a, const T &b, std::function<bool(const T&, const T&)> func)
{
    return func(a,b);
}

template <class T>
bool g(const T &a, const T &b)
{
    return true;
}  

但是任何调用 f() 的尝试,f('a', 'b', g)f(1, 2, g),总是会导致 "no matching function for call to 'f'",无论我是否将变量作为 const 引用传递或者只是简单的值或其他什么。我假设它无法推断出某些模板,但我不知道在哪里或为什么。

我承认,我对一般情况下如何使用函数对象的掌握非常薄弱,这样做有可能吗?

我已经为您解决了一些问题并添加了一些示例。这应该可以帮助您了解如何使用简单的 std::function。

#include <iostream>
#include <string>
#include <functional>

template <class T>
bool f(const T &a, const T &b, std::function<bool(const T&, const T&)> func)
{
    return func(a,b);
}

template <class T>
bool g(const T &a, const T &b)
{
    return a==b; // a simple comparator
}  

int main()
{
   int a = 1;
   int b = 1;

   // instantiate f and g as integer type functions
   if( f<int>(a,b,g<int>) == true) 
      std::cout << "true" << std::endl;
   else
      std::cout << "false" << std::endl;

   std::string c="dead";
   std::string d="beef";
   // and now as strings
   if( f<std::string>(c,d,g<std::string>) == true) 
      std::cout << "true" << std::endl;
   else
      std::cout << "false" << std::endl;
   return 0;
}

参数func被声明为std::function,而您正试图传递一个函数指针,这需要隐式转换。 Template argument deduction不考虑隐式转换,推导失败

Type deduction does not consider implicit conversions (other than type adjustments listed above): that's the job for overload resolution, which happens later.

你可以显式地构造一个std::function

f('a', 'b', static_cast<std::function<bool(const char&, const char&)>>(g<char>));

或显式指定模板参数(绕过模板参数推导并使隐式转换稍后生效),

f<char>('a', 'b', g<char>);    

或者干脆不使用 std::function

template <class T, class F>
bool f(const T &a, const T &b, F func)
{
    return func(a,b);
}

f('a', 'b', g<char>);