编写应用于参数包的函数类型

时间:2015-04-12 04:00:00

标签: c++11 variadic-templates decltype

简短版: 我需要传递一个模板类一个参数包,这是将一个函数应用到另一个参数包的结果。这需要在using声明中工作。

背景: 作为一个挑战,我正在编写python的zip()的通用C ++ 11版本。为了做到这一点,我编写了一个通用的zipIterator模板类,可以用来同时迭代许多迭代器,产生它们的值的元组。例如:

#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容器类,它可以传递容器,并通过在每个容器上调用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答案,它们似乎都是相关的,但我认为它们不是我想要的:

1 个答案:

答案 0 :(得分:1)

using iterator = zipIterator<decltype(std::begin(std::declval<Containers&>()))...>;

基本思想是...扩展左侧的模式。此处,模式为decltype(std::begin(std::declval<Containers&>())) - 在std::begin类型的左值上调用Containers的返回值的类型。