在模板上使用std :: function

Ari*_*rii 4 c++ templates std-function template-argument-deduction

因此,以最简化的形式,我正在进行类似的事情,

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;
}  
Run Code Online (Sandbox Code Playgroud)

但是,任何试图调用f(),任何事情,f('a', 'b', g)f(1, 2, g),结果总是在,无论我是否通过变量为const引用或只是简单的值或任何“呼叫到‘F’没有匹配功能”。我以为它无法推断出某些模板,但是我不知道在哪里或为什么。

我承认,我对如何使用函数对象有一个非常脆弱的把握,这样做是否可能?

son*_*yao 5

参数func声明为std::function,并且您尝试传递函数指针,该函数指针需要隐式转换。模板参数推导不考虑隐式转换,然后推导失败。

类型推导不考虑隐式转换(上面列出的类型调整除外):这是超载解析的工作,稍后会发生。

您可以std::function显式构造一个

f('a', 'b', static_cast<std::function<bool(const char&, const char&)>>(g<char>));
Run Code Online (Sandbox Code Playgroud)

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

f<char>('a', 'b', g<char>);    
Run Code Online (Sandbox Code Playgroud)

或者只是不使用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>);
Run Code Online (Sandbox Code Playgroud)