使用以前未知的模板存储泛型对象 我试图在C++中创建某种事件处理程序。因此,我得到以下信息: template<class W> delegate<W>* bind(W* obj, void (W::*f)(char*)) { return new delegate<W>(obj,f); } 模板 委托*绑定(W*obj,void(W::*f)(char*)) { 返回新代表(obj,f); }

使用以前未知的模板存储泛型对象 我试图在C++中创建某种事件处理程序。因此,我得到以下信息: template<class W> delegate<W>* bind(W* obj, void (W::*f)(char*)) { return new delegate<W>(obj,f); } 模板 委托*绑定(W*obj,void(W::*f)(char*)) { 返回新代表(obj,f); },c++,class,templates,events,c++03,c++11,C++,Class,Templates,Events,C++03,C++11,delegate类和这个函数工作得很好。问题是如何存储bind函数返回的委托对象?我知道,用Boost和C++ 11很容易,但是我怎么解决这个问题而不使用它们呢?我确信这是可能的,因为在像boost和c++11这样复杂的东西出现之前,这是可能的 (他们也以某种方式推动了这一进程) 所以我想做的是: class Test1 { Test1(){} ~Test1(){} template<class W> bind(W* obj, void (W::*

delegate类和这个函数工作得很好。问题是如何存储bind函数返回的委托对象?我知道,用Boost和C++ 11很容易,但是我怎么解决这个问题而不使用它们呢?我确信这是可能的,因为在像boost和c++11这样复杂的东西出现之前,这是可能的

(他们也以某种方式推动了这一进程)

所以我想做的是:

class Test1
{
    Test1(){}
    ~Test1(){}

    template<class W> 
    bind(W* obj, void (W::*f)(char*))
    {
            myCallBack = new delegate<W>(obj,f);
    }

    private:
        delegate * myCallBack;  //this does not work because I have to define the template but I dont know it know it could be anything

}

class Test2
{
    Test2()
    {
        Test1 t;
        t.bind(this, &Test2::callit);
    }
    ~Test2(){}
    void callit(char*)
    {
    }
}
类Test1
{
Test1(){}
~Test1(){}
模板
绑定(W*obj,void(W::*f)(char*))
{
myCallBack=新委托(obj,f);
}
私人:
delegate*myCallBack;//这不起作用,因为我必须定义模板,但我不知道它可能是任何东西
}
类Test2
{
Test2()
{
试验1 t;
t、 绑定(this,&Test2::callit);
}
~Test2(){}
无效卡利特(字符*)
{
}
}

与原始标准(
std::auto_ptr
)相比,智能指针的实现确实更加复杂。但它们都涉及一些更复杂的概念(主要是关于共享指针的引用计数)。使用这些有什么阻碍

如果您需要一个更轻量级的智能指针实现环境,Andrei Alexandrescu的可能会对您有用。至少在有限的系统环境中,我成功地将其无缝集成(比使用boost更好、更容易)

甚至不要试图完全靠你自己去做,有很多陷阱。。。
如果您能够启用标准,只需使用这些

好吧,我知道你到底需要什么。您只需要一个简单的回调运算符,带有固定的调用签名

此示例演示如何针对您的特定案例执行此操作:

#include <iostream>
#include <utility>
#include <type_traits>
#include <vector>
#include <algorithm>



struct Cb {
    virtual ~Cb(){}
    virtual void call(const char*) = 0;
};
template<class C>
struct CmCb : Cb {
    CmCb( C& c_, void (C::*fn_)(const char*) ) : c(c_),fn(fn_)
    {
    }
    virtual void call(const char* s) {
        (c.*fn)(s);
    }
    C& c;
    void (C::*fn)(const char*);
};

struct A {
    void foo( const char* s ) {
        std::cout<<s<<std::endl;
    }
};

class Test1
{
public:
    Test1(){}
    ~Test1(){delete cb;}

    template<class W> 
    void bind(W* obj, void (W::*f)(const char*))
    {
            cb=new CmCb<W>(*obj,f);
    }
    
    void callit(const char* s ){
        cb->call(s);
    }

    private:
        Cb* cb;
};

int main()
{
    Test1 t;
    
    A a;
    t.bind(&a, &A::foo );
    
    t.callit("hey");
}
#包括
#包括
#包括
#包括

#包括。

存储是什么意思?你不能输入
std::auto_ptr
?你到底想做什么?@detunized甚至更好地定义了c++11智能指针中的一个,例如
std::shared_ptr
!我会尽量在一分钟内更新我的问题,以便更详细precise@g-马库利克,我的答案在OP修改代码后出现了问题,我没有时间更正。也许以后吧。我不确定我是否正确理解了你的最后一句话。你能描述一下吗?我会尽快试一试。但这太令人惊讶了,无法工作。如果真是这样,我会哭的。我试过了,它很管用。男人们,你甚至不知道你有多了不起。如果可以的话,我会给你一百万分。你刚刚为我提供了迄今为止我所见过的最令人惊奇的东西。非常感谢。