例如,我们有一些c ++代码,其中一些函数用一些参数执行另一个函数。
#include <iostream>
using namespace std;
template <typename T, typename F>
void todo(const T& param, const F& function)
{
function(param);
}
void foo(int a)
{
cout << a << endl;
}
int main()
{
int iA = 1051;
todo(iA, foo);
return 0;
}
但是如果我们再添加一个名为foo
void foo(double a)
{
cout << a << endl;
}
然后编译器不知道哪个函数生成模板。
!!!重要!!!
这不是真正的代码,它只是一个例子。具体问题是传递重载函数作为参数。
是否有人知道如何明确指出某项功能?
答案 0 :(得分:3)
todo(iA, static_cast<void (*)(int)>(&foo));
是一种方式,代价是呼叫站点的可读性。
测试代码(保留2个字符的缩进 - 我是Myrmidon):
#include <iostream>
using namespace std;
template <typename T, typename F>
void todo(const T& param, const F& function)
{
function(param);
}
void foo(double a)
{
cout << "double " << a << endl;
}
void foo(int a)
{
cout << "int " << a << endl;
}
int main()
{
int iA = 1051;
todo(iA, static_cast<void (*)(int)>(&foo));
todo(iA, static_cast<void (*)(double)>(&foo));
return 0;
}
输出:
int 1051
double 1051
答案 1 :(得分:3)
auto identifier = type{value}
当需要提交特定类型时,这是Sutter Mill在其AAA (Almost Always Auto) Guru of the Week #94中建议的语法。
这完全适用于此:
int iA = 1051;
using foo_int_type = void(*)(int);
auto non_ambiguous_int_foo = foo_int_type{foo};
todo(iA, non_ambiguous_int_foo);
答案 2 :(得分:1)
您可以使用static_cast
选择正确的功能过载。例如:todo(iA, static_cast<void(&)(double)>(foo))