C++ 如何使用重载函数作为函数模板的参数?

C++ 如何使用重载函数作为函数模板的参数?,c++,templates,overloading,C++,Templates,Overloading,我认为每个人都有使用以下代码的经验: void fun(Type1&); void fun(Type2&); vector<Type1> vec; for_each(vec.begin(), vec.end(), fun); 但是还有更好的主意吗?一个解决方案是使用模板功能: template<typename T> void fun(T&); // specialize fun for Type1 and Type2 ... for_each(

我认为每个人都有使用以下代码的经验:

void fun(Type1&);
void fun(Type2&);
vector<Type1> vec;
for_each(vec.begin(), vec.end(), fun);

但是还有更好的主意吗?

一个解决方案是使用模板功能:

template<typename T>
void fun(T&);
// specialize fun for Type1 and Type2
...
for_each(vec.begin(), vec.end(), fun<Type1>);

我想支持基里尔的回答。如果fun()函数的实现非常相似(相同的代码涉及不同的类型),那么最好将它们重写为单个模板函数。另外,您还可以优雅地指定所需的功能

通常建议使用C++等价于C样式的CAST:

for_each(vec.begin(), vec.end(), reinterpret_cast<void(*)(Type1&)>(fun));
对于每个(vec.begin()、vec.end()、reinterpret_cast(fun));
在这种情况下,更合适的做法是使用static_cast:

for_each(vec.begin(), vec.end(), static_cast<void(*)(Type1&)>(fun));
用于每个(vec.begin()、vec.end()、static_cast(fun));
因为我们想提示编译器使用正确的类型

虽然要详细得多,但仅仅出于代码维护的原因还是比较好的——在代码中搜索这样的构造比搜索C样式类型转换更容易

还可以避免使用类型强制转换,而采用显式模板参数规范:

for_each<std::vector<A>::iterator, void(*)(Type1&)>(vec.begin(), vec.end(), fun);
每个(vec.begin(),vec.end(),fun)的

--虽然它与原始代码相比没有太大的改进。如您所见,您还必须显式指定第一个模板参数。

。。。它仍然是类型铸造。事实上,我在另一个网站上看到了这个问题。除了类型转换,我没有想出一个好的解决方案。所以我想看看是否真的有一个优雅的方法来做这件事。但是,在这种情况下,我始终更喜欢函数对象或lambda expr.:)
for_each(vec.begin(), vec.end(), static_cast<void(*)(Type1&)>(fun));
for_each<std::vector<A>::iterator, void(*)(Type1&)>(vec.begin(), vec.end(), fun);