C++ 将函数指针作为模板参数传递
出于教育目的,我尝试编写自己的“ForEach”函数:C++ 将函数指针作为模板参数传递,c++,C++,出于教育目的,我尝试编写自己的“ForEach”函数: #include <iostream> #include <string> #include <vector> // // This works // template<class Container> void ForEach_v1(const Container & inContainer, void (*Functor)(const std::string &)) {
#include <iostream>
#include <string>
#include <vector>
//
// This works
//
template<class Container>
void ForEach_v1(const Container & inContainer, void (*Functor)(const std::string &))
{
typename Container::const_iterator it = inContainer.begin(), end = inContainer.end();
for (; it != end; ++it)
{
Functor(*it);
}
}
//
// Does not work
//
template<class Container, class Functor>
void ForEach_v2(const Container & inContainer, Functor inFunctor)
{
typename Container::const_iterator it = inContainer.begin(), end = inContainer.end();
for (; it != end; ++it)
{
Functor(*it);
}
}
void PrintWord(const std::string & inMessage)
{
std::cout << inMessage << std::endl;
}
int main()
{
std::vector<std::string> words;
words.push_back("one");
words.push_back("two");
words.push_back("three");
// Works fine.
std::cout << "v1" << std::endl;
ForEach_v1(words, PrintWord);
// Doesn't work.
std::cout << "v2" << std::endl;
ForEach_v2(words, PrintWord);
return 0;
}
我的问题是:
- 为什么不打印任何东西
- 为什么编译器会打印“未使用的变量”-ForEach_v2的警告
模板
void ForEach_v2(常量容器和容器、函子信息器)
{
typename容器::常量迭代器it=inContainer.begin(),end=inContainer.end();
for(;it!=end;++it)
{
函子(*it);
}
}
应该是
template<class Container, class Functor>
void ForEach_v2(const Container & inContainer, Functor inFunctor)
{
typename Container::const_iterator it = inContainer.begin(), end = inContainer.end();
for (; it != end; ++it)
{
inFunctor(*it);
}
}
模板
void ForEach_v2(常量容器和容器、函子信息器)
{
typename容器::常量迭代器it=inContainer.begin(),end=inContainer.end();
for(;it!=end;++it)
{
告发人(*it);
}
}
您想要什么
inFunctor(*it);
不是
这是你的问题:
for (; it != end; ++it)
{
Functor(*it);
}
Functor
现在是您传递的函数的类型
你需要这样写:
for (; it != end; ++it)
{
inFunctor(*it); //note this change!
}
现在这就行了
inFunctor(*it);
Functor(*it);
for (; it != end; ++it)
{
Functor(*it);
}
for (; it != end; ++it)
{
inFunctor(*it); //note this change!
}