从嵌套通用数据结构递归获取项目

时间:2015-05-22 19:26:02

标签: c++ templates c++11 generics recursion

我尝试使用模板构建通用容器类,以便可以在容器中存储任意数据类型。我有一个带有虚拟" get"的通用接口类。返回参数化类型的对象的方法。这个容器的一个常见用途是创建一个容器容器"有2级或更多级别。我想做的是提供一个递归的" get"将遍历层次结构并从叶节点返回项目的方法。

以下是一些示例代码,展示了我尝试做的事情:

#include <iostream>

template<typename DataT>
class container_intf
{
   public:

      container_intf() = default;
      virtual ~container_intf() = default;
      virtual DataT get() = 0;
};

class one : public container_intf<int>
{
   public:
      int get() { return 1; };
};

class two : public container_intf<int>
{
   public:
      int get() { return 2; };
};


template<typename DataT>
class generic : public container_intf<DataT>
{
   public:
      DataT get()
      {
         return DataT();
      };
};


int main(int argc, char** argv)
{
   one o;
   two t;
   std::cout << o.get() << "\n";
   std::cout << t.get() << "\n";


   generic<int> g;
   std::cout << g.get() << "\n";

   generic<one> one_nested;
   std::cout << one_nested.get().get() << "\n";


   generic< generic<two> > two_nested;
   std::cout << two_nested.get().get().get() << "\n";

   return 0;
};

基本上,我希望能够打电话给&#34; two_nested.get()&#34;而不是&#34; two_nested.get()。get()。get()&#34;。我尝试过使用类型特征和std :: enable_if,但我还没有能够使用它。辅助类或函数会没问题;我只是希望能够支持任意深度的层次结构。

1 个答案:

答案 0 :(得分:0)

函数return DataT().get()中的generic<DataT>::DataT get()不会解决问题吗?

我的意思是以下类定义:

template<typename DataT>
class generic : public container_intf<DataT>
{
   public:
      //if using c++14, you can use just `auto` as a return type
      decltype (DataT::get()) get() 
      {
         return DataT().get(); //< instead of just `return DataT();`
      };
};