[英]@selector implementation in C++
我需要在 C++ 中实现类似 @selector(Objecitive-C) 的机制。 通过谷歌搜索我发现了。 它对我没有帮助...
template <class AnyClass>
class ClassCallback
{
// pointer to member function
void (AnyClass::*function)(void);
// pointer to object
AnyClass object;
public:
ClassCallback() { }
~ClassCallback() { }
ClassCallback(AnyClass _object, void(AnyClass::*_function)(void))
: object( _object ), function( _function ) { };
virtual void call(){
(object->*function)();
};
};
是否有任何不同的实现方法类似于 objective-C
typedef struct objc_selector *MY_SEL;
需要实现 objc_selector 是 objective-C 中的抽象 class。 如何实现 objc_selector 任何想法......
在 Objective-C 消息传递系统上只需几个精度,带有选择器。
选择器 (SEL) 是一种不透明类型,但它只是类似于char *
的东西,仅包含方法的名称(因此许多类可以共享相同的选择器)。
Obj-C 方法是一个包含以下内容的结构:
SEL
字段char *
包含有关返回类型和 arguments 的信息。IMP
字段就像是:
struct objc_method
{
SEL method_name;
char * method_types;
IMP method_imp;
};
typedef objc_method Method;
IMP
只是一个 C function 指针。
我在使用 Cocos2d-x 时遇到了类似的问题,在我的情况下,我使用callfunc_selector
来获取选择器:
假设一个 class Foo
和其中的方法Bar()
,只需调用callfunc_selector(Foo::Bar);
它会向该方法返回一个CCObject*
。
Objective-C 和 C++ 是非常不同的语言,据我所知 C++ 没有任何与 Objective-C 的选择器等效甚至相似的东西。 如果您解释您要解决的问题,我相信这里有人会很乐意从 C++ 的角度讨论该问题的处理方式。
如果您对在编译 C++ 文件之前使用自定义预处理器感到满意,您可以使用 Qt 的信号和槽机制,这是在稍微扩展的 C++ 中实现消息传递系统。 见这里。
你可能想做这样的事情:
// We use something to define what "identifies" a
class selector {
private:
std::string name;
public:
selector(std::string const& n) : name(n) {}
selector(const char* n) : name(n) {}
};
typedef const selector* SEL;
像这样使用它:
typedef void* (*method) (object&, ...);
struct object {
private:
std::hash<SEL,method>* methods;
public:
object(std::map<SEL,method>* m) : methods(m) {};
};
selector cloneSelector = selector("clone");
typedef void* cloneImplementation(object&, ...) {
....
};
像这样使用它:
std::map<SEL,method> fooMethods;
fooMethods[cloneSelector]=&cloneImplementation;
class foo : public object {
public:
foo() : object(&fooMethods) {};
};
然而,有几个问题(打字,function 签名......)。 您可能不想这样做。
否则,请查看代码。 Gobjc 是开源的,很容易看到它是如何完成的。 查看 (GNU) gobjc 的 objc/deprecated/struct_objc_selector.h 我发现:
struct objc_selector
{
void *sel_id;
const char *sel_types;
};
AFAIK sel_id 是指向由方法名称和(编码)参数类型组成的字符串的指针。
您可能希望对接口中的方法进行分组,并采用一种更“COM-ish”的方式:
struct interface_id {};
class object {
protected:
virtual void* getVtable_(interface_id const&) = 0;
public:
template<class X> X* getVtable() {
return getVtable(X::interface_id);
}
virtual ~object();
};
// Exemple interface
struct FooInterface {
public:
class vtable {
void (*fooMethod2)(void* self, int n);
std::vector<int> (*fooMethod2)(void* self, double x);
};
static interface_id ID;
static std::string NAME; // = "FooInterface"
private:
void* self;
FooVtable* vtable;
public:
void fooMethod1(int n) {
return vtable->fooMethod1(self,n);
};
void fooMethod2(double x) {
return vtable->fooMethod2(self,double x);
};
};
// Exemple object
class foo_object : public bar_object {
private:
static std::map<interface_id, void*> INTERFACES;
public:
virtual void* getVtable_(interface_id const& id) {
void* res = INTERFACES[&id];
if(res!=null)
return res;
else
return bar_object::getVtable(id);
};
};
它提供了如何强制执行 function 签名的想法。 您应该能够对基于选择器的方法使用相同的东西(使用一些无聊的模板元编程代码......)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.