考虑一下这个简单而毫无意义的代码。
#include <iostream>
struct A {
template<int N>
void test() {
std::cout << N << std::endl;
}
};
int main() {
A a;
a.test<1>();
}
这是一个非常简单的函数模板示例。但是,如果我想用重载的 operator()
替换 A::test
以使其成为仿函数怎么办?
#include <iostream>
struct A {
template<int N>
void operator()() {
std::cout << N << std::endl;
}
};
int main() {
A a;
a<1>(); // <-- error, how do I do this?
}
当然,如果 operator()
采用依赖于模板的参数,编译器可能会推断出模板。但我只是想不出用无参数仿函数指定模板参数的正确语法。
有合适的方法吗?
显然,这段代码可以工作,因为它绕过了仿函数语法:
a.operator()<1>();
但这有点违背了它成为仿函数的目的:-P。
最佳答案
你只能打电话
a.operator()<1>();
但这不会使用仿函数。 Functor 需要一个非模板 operator(),因为它们必须能够以 varname() 的形式调用,而这不适用于您的代码。
要使其成为真正的仿函数,请将您的代码更改为模板类(仿函数是类):
#include <iostream>
template<int N>
struct A {
void operator()() {
std::cout << N << std::endl;
}
};
int main() {
A<1> a;
a();
}
关于c++仿函数和函数模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/942170/