如何表明某些超载功能?

时间:2017-11-29 11:54:43

标签: c++

例如,我们有一些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;
}

然后编译器不知道哪个函数生成模板。

!!!重要!!!

这不是真正的代码,它只是一个例子。具体问题是传递重载函数作为参数。

是否有人知道如何明确指出某项功能?

3 个答案:

答案 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

请参阅https://www.ideone.com/DEiLBE

答案 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);

Live demo on coliru

答案 2 :(得分:1)

您可以使用static_cast选择正确的功能过载。例如:todo(iA, static_cast<void(&)(double)>(foo))