小编pap*_*aga的帖子

结构化绑定和引用元组

我在设计一个简单的 zip 函数时遇到了一个问题,可以这样调用:

for (auto [x, y] : zip(std::vector{1,2,3}, std:vector{-1, -2, -3}) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

所以zip会返回一个类型为 的对象zip_range,它本身暴露begin并且end函数返回一个zip_iterator.

现在, a zip_iterator,正如我实现的那样,使用 a std::tuple<Iterators>- 其中迭代器是压缩容器的迭代器的类型 - 来跟踪它在压缩容器中的位置。当我取消引用 a 时zip_iterator,我获得了一个对压缩容器元素的引用的元组。问题是它不适合结构化绑定语法:

std::vector a{1,2,3}, b{-1, -2, -3};
for (auto [x, y] : zip(a, b)) { // syntax suggests by value
    std::cout << ++x << ", " << --y << '\n'; // but this affects a's and b's content
}

for …
Run Code Online (Sandbox Code Playgroud)

c++ c++17

8
推荐指数
2
解决办法
2685
查看次数

sfinae上下文中的模板变量

请考虑第一段代码,其中使用基本SFINAE触发器来区分类型是否是随机访问迭代器:

template <typename T, typename = void>
struct is_random_access_iterator : public std::false_type {};

template <typename T>
struct is_random_access_iterator<T, 
    std::enable_if_t<
        std::is_same_v<typename std::iterator_traits<T>::iterator_category, std::random_access_iterator_tag>
    >>
    : public std::true_type {};

template <typename T>
constexpr bool is_random_access_iterator_v = is_random_access_iterator<T>::value;
Run Code Online (Sandbox Code Playgroud)

此代码编译并按预期工作.现在,考虑第二个片段,我将模板变量替换为enable_if条件,而不更改其定义:

template <typename T>
constexpr bool has_random_access_iterator_tag = 
    std::is_same_v<typename std::iterator_traits<T>::iterator_category, std::random_access_iterator_tag>;

template <typename T, typename = void>
struct is_random_access_iterator : public std::false_type {};

template <typename T>
struct is_random_access_iterator<T, 
    std::enable_if_t<
        //std::is_same_v<typename std::iterator_traits<T>::iterator_category, std::random_access_iterator_tag>
        has_random_access_iterator_tag<T>
    >>
    : public std::true_type {};

template <typename T>
constexpr bool …
Run Code Online (Sandbox Code Playgroud)

c++ templates sfinae

3
推荐指数
1
解决办法
151
查看次数

Lisp 从字符串创建属性列表

通用语言服务程序

这是我的问题:我想从 csv 文件读取列标题,并从这些标题创建一个返回 plist 的函数,其中标题是属性名称:

假设我们有一个 csv 文件,其列标题为“名称”、“日期”、“事件”。我想从这 3 个字符串创建一个如下函数:

(defun read-csv-line (x y z)
  (list :Name x :Date y :Event z))
Run Code Online (Sandbox Code Playgroud)

这样我就可以继续阅读以下几行:

(read-csv-line "Bob" "1/1/1985" "Birthday")
Run Code Online (Sandbox Code Playgroud)

我认为宏可以解决这个问题:

(defmacro convert-to-plist (x y z)
  `(defun read-csv-line (a b c)
     (list :,(intern x) a :,(intern y) b :,(intern z) c)))
Run Code Online (Sandbox Code Playgroud)

但这种语法不被认为是正确的。

那你说我怎么能做到呢?当然,如果参数数量可变的话会更好......

提前致谢!你的,h

macros metaprogramming common-lisp plist

2
推荐指数
1
解决办法
788
查看次数

标签 统计

c++ ×2

c++17 ×1

common-lisp ×1

macros ×1

metaprogramming ×1

plist ×1

sfinae ×1

templates ×1