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

new 在 lambda

看到一个问题,如何把 lambda 弄到 new 出来的地址上。 一开始的想法是:lambda 在声明的时候就已经是 rv 了,而 trivial move ctor 是 优先 move 的 bitwise copy,那肯定搞不定啊。 举例说: something = move([]{}); // 此时,某个匿名函数已经构造完毕,所以 这里的实际代码是: something.m_a = move(__unnamed.m_a); something.m_b = move(__unnamed.m_b); … 等于白搭。 但两次询问问题人后其确定 void* p = (void*) new sometype([]{}); 的语法是能够把 lambda 的构造弄到 new 出来的内存上的。于是开干吧。 首先查阅 gcc 源码,得知其 lambda 命名规则是 __lambda%d,%d 跟第 lambdacnt 个。所以 第 […]