c++仿函数和函数模板

标签 c++ templates functor

考虑一下这个简单而毫无意义的代码。

#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/

相关文章:

c++ - 公开添加但继承私有(private)

c++ - C++ 中的 LNK2019 链接错误

c++ - 定义模板结构的特征时出现不完整的类型错误

Haskell 空函数

c++ - 我可以将 zlib 的 z_stream 重复用于多个操作吗?

c++ - Qt5 - 未找到 Windows : VCRUNTIME140D_APP. dll

c++ - 即使存在转换,也无法将子类模板转换为基类的另一个模板

c++ - 将函数作为模板参数传递给成员函数

haskell - 为什么 "fmap (replicate 3) Just"的类型为 "a -> [Maybe a]",在 Haskell 中

java - 是否可以在 Java 8 中使用对象的特定方法(或静态方法)作为仿函数