gpt4 book ai didi

c++ - C++ 中的回调,模板成员?

转载 作者:太空狗 更新时间:2023-10-29 23:31:50 24 4
gpt4 key购买 nike

以下代码不起作用,但它很好地表达了我想做的事情。模板结构容器存在问题,我认为它应该工作,因为它的大小对于任何模板参数都是已知的。

class callback {

public:

// constructs a callback to a method in the context of a given object
template<class C>
callback(C& object, void (C::*method)())
: ptr.o(object), ptr.m(method) {}

// calls the method
void operator()() {
(&ptr.o ->* ptr.m) ();
}

private:

// container for the pointer to method
template<class C>
struct {
C& o;
void (C::*m)();
} ptr;

};

有什么办法可以做这样的事情吗?我的意思是有一个非模板类回调来包装任何指向方法的指针?

感谢 C++ 大师!

编辑:

请看这个:

Callback in C++, template member? (2)

最佳答案

这是一个完整的工作示例,可以执行我认为您正在尝试执行的操作:

#include <iostream>
#include <memory>

// INTERNAL CLASSES

class CallbackSpecBase
{
public:
virtual ~CallbackSpecBase() {}
virtual void operator()() const = 0;
};

template<class C>
class CallbackSpec : public CallbackSpecBase
{
public:
CallbackSpec(C& o, void (C::*m)()) : obj(o), method(m) {}
void operator()() const { (&obj->*method)(); }

private:
C& obj;
void (C::*method)();
};

// PUBLIC API

class Callback
{
public:
Callback() {}

void operator()() { (*spec)(); }

template<class C>
void set(C& o, void (C::*m)()) { spec.reset(new CallbackSpec<C>(o, m)); }

private:
std::auto_ptr<CallbackSpecBase> spec;
};

// TEST CODE

class Test
{
public:
void foo() { std::cout << "Working" << std::endl; }
void bar() { std::cout << "Like a charm" << std::endl; }
};

int main()
{
Test t;
Callback c;
c.set(t, &Test::foo);
c();
c.set(t, &Test::bar);
c();
}

关于c++ - C++ 中的回调,模板成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1284014/

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