C++ 将函数指针作为模板参数传递

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 &)) {

出于教育目的,我尝试编写自己的“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;
}
我的问题是:

  • 为什么不打印任何东西
  • 为什么编译器会打印“未使用的变量”-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!
    }