2011-05-19 64 views
1

假设我有一个对象。可能是一个客观的C对象;可能是一个C++对象。有没有一种方法来测试它不会抛出任何异常?cocoa touch - 测试对象是否是客观的C对象

编辑:我很高兴地使用任何工程构造,包括模板,如果他们会做这项工作。

+0

正在使用@try/@捕获一个选项? – Arcantos 2011-05-19 18:11:24

+0

据我所知,没有。 @ try/@ catch是一个客观的C构造,并且在给定非objectiveC对象时它似乎会抛出。 – 2011-05-19 18:42:54

+1

实际上你是否有一个对象,或者只是一个来自删除类型信息的来源的指针;那可能是一个C++对象的地址或者一些Objective-C对象的ID? – rvalue 2011-10-27 03:26:23

回答

1

朋友找到了this关于Cocoa with Love博客。显然,这个问题并不是微不足道的。

+0

objc_lookUpClass(const char * name)和objc_getClass( const char * name)如果你知道C++类的名字?当这些对象中缺少实现时,C++类是否在obj-c运行时注册?我错过了什么吗? – TheBlack 2011-05-19 19:24:40

0

既然你可以使用模板,你可以做一些事情来创建一些类型的函数,它需要一个通用的模板参数,然后使用C++使用的所有类实例化你的基类。如果它不是C++类,那么函数返回false。因此,例如:

//...in some header file 
template<typename T> 
bool is_cplusplus(const T* type) { return false; } 

#define IS_CPLUSPLUS_T(class) \ 
      template<> \ 
      inline bool is_cplusplus(const class* type) { return true; } 

//...now use the macro to declare all your C++ classes as "true" in the return 
//from is_cplusplus() 
IS_CPLUSPLUS_T(my_class1) 
IS_CPLUSPLUS_T(my_class2) 

//...now use in some code in a separate .cpp file or .mm file, etc. 
my_class1 a_class; 
if (is_cplusplus(&a_class)) 
{ 
    //do something 
} 

我专门使用指针而不是在这里引用,因为这是我的理解是,你可以实例化一个C++模板,一个指向Objective-C的对象,其中,与Objective-C的实例对象本身不起作用。如果这种假设不正确,那么通过将指针更改为引用可以让生活变得更容易一些。

+0

当然,但我不想放大对象。 – 2011-05-19 18:39:04

+0

您可以在解决方案中使用模板吗?我不是一个Objective-C++专家,但我确实知道很多时候C++模板和Objective-C对象不会很好,所以让我知道如果您可以在您的解决方案中使用模板来至少检测是否有某种东西C++类... – Jason 2011-05-19 18:47:59

+0

@William Jockusch:好的,我正在对答案进行另一次尝试...希望这不会太麻烦...... – Jason 2011-05-19 19:29:12

0

我认为它可以做得比这更简单,如果这种类型是静态可用的(如使用模板作为选项所暗示的)。 Objective-C对象可以隐式转换为NSObject和/或'id' - C++对象不会(至少没有每个类的自定义代码添加cast操作符)。

函数原型这里由const&传递参数,因为我已经用Objective-C的类型模板问题通过的Objective-C消息返回的,这似乎工作,其中纯NSObject的*没有。

相关问题