预处理元编程笔记(生肉)

BOOL(x) 怎么做? 目标:0->0, 其他 -> 1. 方法: #define BOOL(x) BOOL_ ## x 此时, #define BOOL_0 0 #define BOOL_1 1 #define BOOL_2 2 … #if(condition, t, f) => if(bool(condition), t, f) => if_1(t, f) t, if_0(t, f) f 注意这个:https://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html gcc 和 MSVC 支持。其他编译器普遍不支持 分治: #define MACRO_GET_1(str, i) (sizeof(str) > (i) ? str[(i)] : 0) #define MACRO_GET_4(str, […]

std::bind 源码阅读(未加工的生肉)

template<class _Tp> struct __is_bind_expression : public false_type {}; template<class _Tp> struct _LIBCPP_TYPE_VIS_ONLY is_bind_expression : public __is_bind_expression<typename remove_cv<_Tp>::type > {}; template<class _Tp> struct __is_placeholder : public integral_constant< int, 0> {}; template<class _Tp> struct _LIBCPP_TYPE_VIS_ONLY is_placeholder : public __is_placeholder<typename remove_cv<_Tp>::type > {}; 首先是 is_bind_expression 和 is_placeholder. 从这里看 is_bind_expression 会把 cv qualifier 去掉然后返回 false_type. 我猜测会有其他的 is_bind_expression 模板在其他地方定义。 namespace […]

functional 标准及 libcxx 实现. Part1 – 算数函数及基础设施

前言。。。 因为实在太长所以还是分几部分写吧。重中之重当然是 std::bind. std::function 其实实现不很难,就是体积大。 这篇主要说的是基础设施,包括最基本的定义和到处被用到的函数。 另因为 形如 template <Args…> struct {}; 的 和 形如 Ret(Args…) 的,前者是元编程里的元函数,后者是通常说法里的函数,下面可能统统会被叫做 函数,不作区分。 下面会从 标准对 functional 的定义,clang 对 functional 的实现 两方面做阐述。 大图片: functional 里主要包括两大主要设施以及两个小块。 两大设施:std::bind 和 std::function. 两小块:各种 hash 以及各种运算符的函数格式(比如 + 对应 plus 什么的)。与之相关的是 deprecated 的 binary_function 和 unary_function. 。 在 clang 里,functional 主要包含了 type_traits 和 __functional_base 两个头文件,阅读源码的时候也需要重点关注。另用到了 tuple 的一些设施。 […]