将功能模板传递给其他功能

时间:2012-02-16 09:37:52

标签: c++ templates function-pointers

假设我有一个在任意容器类型(C ++ 11)上执行某些操作的函数:

template<class containerType>
void bar( containerType& vec ) {

        for (auto i: vec) {
                std::cout << i << ", ";
        }

        std::cout << '\n';
}

我可以从另一个函数调用此函数:

void foo() {
        std::vector<int> vec = { 1, 2, 3 };
        bar(vec);
}

现在假设我有不同的函数就像bar一样,我想将这些函数中的一个传递给foo,然后foo看起来像这样:

template<class funcType>
void foo( funcType func ) {
    std::vector<int> vec = { 1, 2, 3 };
    func(vec);
}

然而,像这样调用foo:

foo(bar);

不起作用(非常清楚,因为bar不是函数而是函数模板)。这有什么好的解决方案吗?我如何定义foo才能使其工作?

编辑:这是一个最小的可编译示例,正如评论所要求的那样......

#include <iostream>
#include <vector>
#include <list>

template<class containerType>
void bar( containerType& vec ) {

        for (auto i: vec) {
                std::cout << i << ", ";
        }

        std::cout << '\n';
}

template<typename funcType>
void foo(funcType func) {

        std::vector<int> vals = { 1, 2, 3 };
        func(vals);

}

int main() {
        // foo( bar );  - does not work.
}

3 个答案:

答案 0 :(得分:4)

http://ideone.com/HEIAl

上的在线演示

这允许您执行foo(bar)。我们传入一个具有模板成员函数的非模板类,而不是传入模板函数或模板类。

#include <iostream>
#include <vector>
#include <list>

struct {
    template<class containerType>
    void operator() ( containerType& vec ) {

        for (auto i = vec.begin(); i!=vec.end(); ++i) {
                std::cout << *i << ", ";
        }

        std::cout << '\n';

    }
} bar;

template<typename funcType>
void foo(funcType func) {

        std::vector<int> vals = { 1, 2, 3 };
        func(vals);

}

int main() {
        foo( bar );
}

答案 1 :(得分:3)

如果您知道foo使用int向量,则可以传递bar< std::vector<int> >函数。

合理的解决方案是定义foo的模块也为所使用的容器定义typedef。那么您甚至不需要bar作为模板。

答案 2 :(得分:2)

这样的东西? (没有完全清醒,可能会忽略这一点)

#include <iostream>
#include <vector>
#include <list>

struct Test{
template<class containerType>
static void apply( containerType& vec ) {

        for (auto it = vec.begin(); it != vec.end(); ++it) {
                std::cout << *it << ", ";
        }

        std::cout << '\n';
}
};

template<class FuncStruct>
void foo() {

        std::vector<int> vals;
        vals.push_back(1);
        FuncStruct::apply(vals);

}

int _tmain(int argc, _TCHAR* argv[])
{
    foo<Test>();
    return 0;
}