[英]Passing a function pointer as template parameter
出于教育目的,我正在尝试编写自己的“ForEach”函数:
#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;
}
编译器输出:
|| g++ -Wall -o test main.cpp
|| main.cpp: In function 'void ForEach_v2(const Container&, Functor) [with Container = std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, Functor = void (*)(const std::string&)]':
main.cpp|116| instantiated from here
main.cpp|96| warning: unused variable 'it'
节目输出:
v1
one
two
three
v2
我的问题:
ForEach_v2
为什么不打印任何东西? ForEach_v2
打印“未使用的变量” - ForEach_v2
? 你要
inFunctor(*it);
不
Functor(*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)
{
Functor(*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);
}
}
这是你的问题:
for (; it != end; ++it)
{
Functor(*it);
}
Functor
现在是您传递的函数的类型 。
你需要写这个:
for (; it != end; ++it)
{
inFunctor(*it); //note this change!
}
现在这将工作!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.