C++流日志Objective-C对象
C++ stream log Objective-C objects
我正在尝试编写一个C++流记录器,它也能够打印objective-C++变量。问题是,我无法编译它,因为在调用提供对象描述的obj-c方法时进行了模板类型检查。
我想对如何实现它有一些想法。
感谢
#ifdef __OBJC__
//for operator<< on obj-c objects
#import <Foundation/Foundation.h>
#import <CoreLocation/CoreLocation.h>
//SFINAE to get whether we have a obj-c class or not
template<class T> struct IsObjectiveCClass {
using yesT = char (&)[10];
using noT = char (&)[1];
static yesT choose(id);
static noT choose(...);
static T make();
enum { value = sizeof(choose(make())) == sizeof(yesT) };
};
#endif
class Logger {
...
template <typename T>
Logger &operator <<(T data) {
#if __OBJC__
if (IsObjectiveCClass<T>::value) {
... How to cast (data to obj) without errors? ...
stream->ts << [[obj description] UTF8String];
} else {
#endif
stream->ts << data;
#if __OBJC__
}
#endif
}
尝试类似的东西
template<typename T, typename V = bool>
struct is_objc_class : std::false_type { };
template<typename T>
struct is_objc_class<T,
typename std::enable_if<std::is_convertible<T, id>::value, bool>::type
> : std::true_type { };
template <
class T,
class = typename std::enable_if<is_objc_class<T>::value>::type
>
std::ostream& operator<< (std::ostream& stream, T const & t) {
stream << [[t description] UTF8String];
return stream;
}
struct Logger
{
Logger(std::ostream &s):stream(s){}
std::ostream &stream;
// for objc class
template <class T>
typename std::enable_if<is_objc_class<T>::value, Logger&>::type
operator<< (T const & t) {
stream << [[t description] UTF8String];
return *this;
}
// for everything else
template <class T>
typename std::enable_if<!is_objc_class<T>::value, Logger &>::type
operator<< (T const & t) {
stream << t;
return *this;
}
};
int main(int argc, char *argv[])
{
std::cout << std::boolalpha
<< is_objc_class<id>::value << std::endl
<< is_objc_class<int>::value << std::endl
<< is_objc_class<NSString *>::value << std::endl
<< @"test" << std::endl
<< @[@1] << std::endl
;
Logger l(std::cout);
l << @"test" << "test2" << @1 << 1;
}
相关文章:
- 创建跨平台 C++ 触摸管理器.在 c++ 中传递 Objective-c 对象涉及代码
- C++对象作为 Objective-C++ 属性
- 如何在从Objective C调用C++回调后释放桥接对象
- 使用 c++ 标准::unique_ptr<> 或 std::shared_ptr<> 管理 objective-C 对象
- 防止从C++代码中调用 Objective-C 对象
- Objective-C++C++对象析构函数
- 如何在C++应用程序中处理指向 Objective-C 对象的指针
- 如何确定 void * 指针在运行时指向 objective-c 对象还是 c++ 对象
- 有没有办法用C++类包装一个 Objective-C 对象
- 在Objective c包装器中传递c++对象
- Cocoa Objective-C:使用c++对象作为NSDictionary键
- Objective-C块和c++对象
- 添加c++对象到Objective C集合(NSSet)的麻烦
- Objective-C:如果我在ARC的函数中返回一个c++对象,它会创建一个副本吗?我是否必须手动释放该副本?
- 我可以添加自己的类型转换操作符,以便能够将c++对象转换为objective C吗?
- 在c++对象中使用ARC和Objective C对象会发生什么?
- 在没有对象的情况下从Objective C调用特定的C++方法
- C++流日志Objective-C对象
- cocoa touch -- 测试对象是否是 objective-C 对象
- 从c++对象调用Objective-C父对象