【发布时间】:2017-07-30 10:29:36
【问题描述】:
假设int 和double 有函数ovelaods。
void Print(int v)
{
cout << v << endl;
}
void Print(double v)
{
cout << v << endl;
}
有一个函数旨在作为可调用的上述函数之一传入。
template<typename FnT>
void Function(int v, FnT&& fn)
{
fn(v);
}
但是下面的代码是模棱两可的:
Function(1, Print);
Compiller 无法推断出第二个参数的类型。这很容易解决:
Function(1, static_cast<void(*)(int)>(Print));
我相信存在更通用和优雅的方式来解决这个问题。在 STL 算法中,添加函数重载时可能会出现此问题。
vector<int> v = { 1,2,3 };
for_each(v.begin(), v.end(), Print); // ambigous code
如何巧妙地解决这个问题?
【问题讨论】:
-
我的意思是,您可以为此滥用模板,但在您的示例中,1)您不需要重载和 2)而不是
std::for_each使用范围 for 循环。 -
这只是一个综合示例。当使用任何 STL 算法或任何带有可调用函数作为输入参数的函数时,您可以在任何上下文中面对它。这是我的观点。
-
Have a look here。函数模板也会出现同样的问题。 Vittorio Romeo 的解决方案是通用且简洁的,尽管使用了宏。它也适用于您的情况(事实上,它甚至使用相同的打印示例)。
-
谢谢。有道理。
标签: c++ templates stl overloading