我在设计一个简单的 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) 请考虑第一段代码,其中使用基本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) 通用语言服务程序
这是我的问题:我想从 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