gpt4 book ai didi

c++ - 无法从模板类调用通用 std::function 成员

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:20:59 25 4
gpt4 key购买 nike

编译以下代码时:

#include <functional>

template <typename functionSignature>
class Class
{
std::function<functionSignature> func;
public:
Class(const std::function<functionSignature>& arg) : func(arg) {}
void callFunc() { func(); }
};

void f(const int i) {}

int main()
{
Class<void(const int)> a(std::bind(f, 10));
a.callFunc();
return 0;
}

VS 2015 编译器在第六行生成以下错误消息:

error C2064: term does not evaluate to a function taking 0 arguments.

现在,我相信这是因为编译器认为 functionSignature好吧,它不是函数签名;当我实例化并尝试调用 operator() 时会发生同样的错误在 std::function<int> 上而不是 std::function<int()> ,例如。

我如何保证模板参数始终是函数签名,以便我可以调用 operator()std::function 上?

最佳答案

我怀疑你想要这样的东西:

template <typename F>
class Class;

template<typename R, typename... P>
class Class<R(P...)> {
public:
std::function<R(P...)> func;
void callFunc(P... p) { func(p...); }
};

通过这种方式使用部分特化,您可以轻松定义所需的类型。
例如,您可以将其用作:

Class<int(double)> c;

当然,我注意到您的类没有构造函数,因此调用 func 不是一个好主意,但是定义它并将适当的函数作为参数传递是很容易的。

它遵循一个完整的工作示例,其中我使用了 operator() 来调用该函数:

#include <functional>

template <typename F>
class Class;

template<typename R, typename... P>
class Class<R(P...)> {
public:
Class(std::function<R(P...)> f): func{f} { }
void operator()(P... p) { func(p...); }
private:
std::function<R(P...)> func;
};

void fn() { }

int main() {
std::function<void()> f = fn;
Class<void()> c{f};
c();
}

关于c++ - 无法从模板类调用通用 std::function 成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35324267/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com