基础的C ++模板子类没有模板。如何通过基础提取模板信息?

时间:2017-10-21 02:40:54

标签: c++ templates iterator

我的更多玩具代码在这里:http://coliru.stacked-crooked.com/a/976e31bf360d7d15

var response = flurlClient.SendAsync(
    HttpMethod.Get, null, null, HttpCompletionOption.ResponseHeadersRead);
var stream = response.Content.ReadAsStreamAsync();

更具体地说,我有一个没有模板参数的轻量级界面。子类化,它是一个包含std :: vector的模板类。

我希望我可以创建一个模板化的虚方法,以便通过指向接口的指针访问子类中的封装向量的迭代器。

如果这是我想做的事情,我怀疑我很好并且真的是F $%@但是我想知道是否有任何聪明的技巧可以让人们做到这一点或强迫编译器做一些接近的事情我想要的东西 - 有时候C ++真的需要杂技

1 个答案:

答案 0 :(得分:0)

我想你想让你的界面非常通用,这样它就可以作为你所有子类的接口。如果您愿意让父母成为模板类(不确定这是否是您正在寻找的内容),仍然可以通过模板实现这一目标。

然后你可以使用子类'模板typename专门用于继承。像这样:

#include <vector>
#include <cstdlib>
#include <iostream>
struct TypeCode {};
template <typename T> struct DynamicInterface {
    virtual ~DynamicInterface() = default;
    virtual size_t size() const = 0;
    virtual TypeCode type() const = 0;
    virtual typename std::vector<T>::iterator begin() = 0;
    virtual typename std::vector<T>::iterator end() = 0;
};
template <typename T> struct DynamicVector : public DynamicInterface<T> {
public:
    ~DynamicVector<T>() override = default;
    DynamicVector<T>(const std::vector<T>& vec, const TypeCode type) : vec_(vec), type_(type) {}
    size_t size() const override { return vec_.size(); }
    TypeCode type() const override { return type_; }
    T& operator[](size_t n) { return vec_[n]; }
    typename std::vector<T>::iterator begin() {return vec_.begin(); }
    typename std::vector<T>::iterator end() {return vec_.end(); }
private:
    std::vector<T> vec_;
    TypeCode type_;
};

int main() {
  TypeCode t;
  std::vector<int> v{1, 2};
  DynamicVector<int> d(v, t);
  std::cout << "begin: " << *d.begin() << "\n";
  std::cout << "end: " << *(d.end() - 1) << "\n";
}

这会给你输出:

begin: 1
end: 2