编写应用于参数包的函数类型
Writing the types of a function applied to parameter pack
简短版本:
我需要传递一个模板class一个参数包,这是将一个函数应用到另一个参数包的结果。这需要在 using
语句中工作。
背景:
作为挑战,我正在编写 python 的 zip()
的通用 C++11 版本。为此,我编写了一个通用的 zipIterator
模板 class,它可用于同时迭代多个迭代器,生成它们的值的元组。例如:
#include "zip.hpp"
#include <iostream>
#include <vector>
#include <tuple>
int main(){
std::vector<int> vec = {0,1,2,3};
char arr[] = {'a','b', 'c'};
zipIterator<decltype(vec.begin()), char*, decltype(vec.rbegin())>
itr(vec.begin(), std::begin(arr), vec.rbegin());
zipIterator<decltype(vec.begin()), char*, decltype(vec.rbegin())>
end(vec.end(), std::end(arr), vec.rend());
for(; itr!=end; ++itr){
std::cout << "(" << std::get<0>(*itr) << ", " << std::get<1>(*itr)
<< ", " << std::get<2>(*itr) << ")" << std::endl;
}
}
//output:
//(0, a, 3)
//(1, b, 2)
//(2, c, 1)
问题
我想制作一个 zip
容器 class ,它可以传递容器,并通过在每个容器上调用 std::begin() 和 std::end() 来压缩它们。到目前为止我有这个:
template<typename... Containers>
class zip{
public:
using iterator = zipIterator<???>;
zip(Containers... cs) : begin_(iterator(std::begin(cs)...)),
end_(iterator(std::end(cs)...)){};
iterator begin() {return begin_;}
iterator end() {return end_;}
private:
iterator begin_;
iterator end_;
};
我的问题是:用什么代替 ???
来完成这项工作?到目前为止我已经尝试过
std::begin(std::declval<Containers>())...
,
decltype(std::begin(Containers)...)
,
std::result_of<std::begin(Containers)>::type...
,
以及更多的变体。
抱歉,如果这是重复的。我阅读了以下 Stack Overflow 答案,它们似乎都是相关的,但我认为它们不是我要找的东西:
C++11 call member function on template parameter pack of base classes if present
How to make generic computations over heterogeneous argument packs of a variadic template function?
Calling a function for each variadic template argument and an array
using iterator = zipIterator<decltype(std::begin(std::declval<Containers&>()))...>;
基本思路是 ...
扩展其左侧的 模式 。在这里,模式是 decltype(std::begin(std::declval<Containers&>()))
- 当调用 Containers
.
类型的左值时 std::begin
的 return 值的类型
简短版本:
我需要传递一个模板class一个参数包,这是将一个函数应用到另一个参数包的结果。这需要在 using
语句中工作。
背景:
作为挑战,我正在编写 python 的 zip()
的通用 C++11 版本。为此,我编写了一个通用的 zipIterator
模板 class,它可用于同时迭代多个迭代器,生成它们的值的元组。例如:
#include "zip.hpp"
#include <iostream>
#include <vector>
#include <tuple>
int main(){
std::vector<int> vec = {0,1,2,3};
char arr[] = {'a','b', 'c'};
zipIterator<decltype(vec.begin()), char*, decltype(vec.rbegin())>
itr(vec.begin(), std::begin(arr), vec.rbegin());
zipIterator<decltype(vec.begin()), char*, decltype(vec.rbegin())>
end(vec.end(), std::end(arr), vec.rend());
for(; itr!=end; ++itr){
std::cout << "(" << std::get<0>(*itr) << ", " << std::get<1>(*itr)
<< ", " << std::get<2>(*itr) << ")" << std::endl;
}
}
//output:
//(0, a, 3)
//(1, b, 2)
//(2, c, 1)
问题
我想制作一个 zip
容器 class ,它可以传递容器,并通过在每个容器上调用 std::begin() 和 std::end() 来压缩它们。到目前为止我有这个:
template<typename... Containers>
class zip{
public:
using iterator = zipIterator<???>;
zip(Containers... cs) : begin_(iterator(std::begin(cs)...)),
end_(iterator(std::end(cs)...)){};
iterator begin() {return begin_;}
iterator end() {return end_;}
private:
iterator begin_;
iterator end_;
};
我的问题是:用什么代替 ???
来完成这项工作?到目前为止我已经尝试过
std::begin(std::declval<Containers>())...
,
decltype(std::begin(Containers)...)
,
std::result_of<std::begin(Containers)>::type...
,
以及更多的变体。
抱歉,如果这是重复的。我阅读了以下 Stack Overflow 答案,它们似乎都是相关的,但我认为它们不是我要找的东西:
C++11 call member function on template parameter pack of base classes if present
How to make generic computations over heterogeneous argument packs of a variadic template function?
Calling a function for each variadic template argument and an array
using iterator = zipIterator<decltype(std::begin(std::declval<Containers&>()))...>;
基本思路是 ...
扩展其左侧的 模式 。在这里,模式是 decltype(std::begin(std::declval<Containers&>()))
- 当调用 Containers
.
std::begin
的 return 值的类型