将 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>);
所以在最精炼的形式中,我有这样的事情发生,
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>);