is_container 和 add 的修改版

使用boost库对is_container的修改 利用现有boost库,对owensss实现的is_container等设施做一些更新,使代码更简洁 has_xxx.hpp #ifdef TNAME #include <type_traits> #include <boost/preprocessor/cat.hpp> template <class T> struct BOOST_PP_CAT(has_, TNAME) { template <class> static constexpr bool test(…) { return false; } template <class U> static constexpr bool test(std::remove_reference_t<typename U::TNAME>*) { return true; } static constexpr bool value = test<T>(nullptr); using type = ::bool_<value>; }; template <class T> constexpr bool BOOST_PP_CAT(BOOST_PP_CAT(has_, […]

一个 通用的 add 设施 以及 is_container

写了一个通用的 add 设施, 原型如下: add(container_output, container_input) // 重载 1 效果: 把 container_input 里的所有元素加到(push_back) container_output 里 add(container_output, elements…) // 重载 2 效果: 把所有 elements 加到(push_back) container_output 里 实现上, 使用 enable_if 做函数决议. 为此写了一个 is_container 设施判断类型是否是 container. 该设施部分遵循 Container Concept 的定义. 主要是构造啊 swap 啊几个操作符啊查起来太麻烦了. 所以没加. 首先是 is_container 的实现: pp_cat.h, 做字符拼接. #ifndef BOOST_PP_CAT # define BOOST_PP_CAT(a, b) BOOST_PP_CAT_I(a, b) […]

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

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, […]