假设我有一个在任意容器类型(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.
}
答案 0 :(得分:4)
这允许您执行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;
}