您的位置:首页 > 编程语言

一个简单的元编程例子

2011-05-09 12:55 429 查看
在asio中有这么一段代码

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,一切都是编译期确定,无需函数调用,所以也不需要提供定义。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息