使用以前未知的模板存储泛型对象 我试图在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); }
delegate类和这个函数工作得很好。问题是如何存储bind函数返回的委托对象?我知道,用Boost和C++ 11很容易,但是我怎么解决这个问题而不使用它们呢?我确信这是可能的,因为在像boost和c++11这样复杂的东西出现之前,这是可能的 (他们也以某种方式推动了这一进程) 所以我想做的是:使用以前未知的模板存储泛型对象 我试图在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::*
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修改代码后出现了问题,我没有时间更正。也许以后吧。我不确定我是否正确理解了你的最后一句话。你能描述一下吗?我会尽快试一试。但这太令人惊讶了,无法工作。如果真是这样,我会哭的。我试过了,它很管用。男人们,你甚至不知道你有多了不起。如果可以的话,我会给你一百万分。你刚刚为我提供了迄今为止我所见过的最令人惊奇的东西。非常感谢。