一个简单的元编程例子
2011-05-09 12:55
429 查看
在asio中有这么一段代码
将它转成一个通俗的问题:编译期判断某个类型是否是一个指针类型。
两个HELPER函数都无需定义。
编译期间,根据参数类型,匹配其中一个函数,并检查返回类型的SIZEOF,一切都是编译期确定,无需函数调用,所以也不需要提供定义。
template <typename Stream> char is_read_buffered_helper(buffered_stream<Stream>* s); template <typename Stream> char is_read_buffered_helper(buffered_read_stream<Stream>* s); struct is_read_buffered_big_type { char data[10]; }; is_read_buffered_big_type is_read_buffered_helper(...); } // namespace detail /// The is_read_buffered class is a traits class that may be used to determine /// whether a stream type supports buffering of read data. template <typename Stream> class is_read_buffered { public: #if defined(GENERATING_DOCUMENTATION) /// The value member is true only if the Stream type supports buffering of /// read data. static const bool value; #else BOOST_STATIC_CONSTANT(bool, value = sizeof(detail::is_read_buffered_helper((Stream*)0)) == sizeof(char)); #endif };
将它转成一个通俗的问题:编译期判断某个类型是否是一个指针类型。
typedef char YES; typedef short NO; /////FUNCTION 1 template <typename T> YES IsPtrHelper(T* p); /////FUNCTION 2 No IsPtrHelper(...); template <typename T> bool IsPtr(const T& p) { return sizeof(YES) == sizeof(IsPtrHelper(p)); }
两个HELPER函数都无需定义。
编译期间,根据参数类型,匹配其中一个函数,并检查返回类型的SIZEOF,一切都是编译期确定,无需函数调用,所以也不需要提供定义。
相关文章推荐
- C++中回调函数的一个简单例子?
- 图灵机器人(智能云交互API)的一个java实现简单例子
- 使用Multiplayer Networking做一个简单的多人游戏例子-2/3(Unity3D开发之二十六)
- 一个简单的优化例子(锁问题)
- ADO.NET Entity Framework 一个简单数据绑定例子
- PhpMyAdmin的简单安装和一个mysql到Redis迁移的简单例子
- c#中子线程控制进度条的一个简单例子(多线程问题)
- [转]一个简单的Linux多线程例子 带你洞悉互斥量 信号量 条件变量编程
- 简单的一个jsr75例子--浏览本机文件夹及文件
- auto_ptr的一个简单例子
- 【Python】一个简单的例子
- 一个简单的例子让你理解值传递和引用传递
- 关于ExpandableListView用法的一个简单小例子
- 一个简单的C#多线程间同步的例子
- 写的一个简单的有关函数重载的例子
- 委托的一个最简单的例子
- CSS布局中一个简单的应用BFC的例子
- 一个简单的 ASP.NET MVC 例子演示如何在 Knockout JS 的配合下,使用 TypeScript 。
- liunx sys属性节点的使用(一个简单小例子)
- 一个简单的Hibernate例子的心得