【问题标题】:Recursively getting item from nested generic data structure从嵌套的通用数据结构中递归获取项目
【发布时间】:2015-08-04 22:27:05
【问题描述】:

我正在尝试使用模板构建一个通用容器类,以便可以在容器中存储任意数据类型。我有一个带有虚拟“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;
};

基本上,我希望能够调用“two_nested.get()”而不是“two_nested.get().get().get()”。我试过使用类型特征和 std::enable_if 但我无法让它工作。辅助类或函数会很好;我只是希望能够支持任意深度的层次结构。

【问题讨论】:

  • 如果容器根本没有定义get(),而只定义了基本情况get(),那么调用two_nested.get()会直接到达基本情况。

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


【解决方案1】:

函数generic&lt;DataT&gt;::DataT get() 中的return 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();`
      };
};

【讨论】:

  • 这在 DataT = int 时不起作用。此外,该函数需要与 container_intf 中的虚函数“DataT get()”具有相同的签名。
  • 你是对的,函数会变成非虚拟的。虽然,我不确定模板类中这种虚函数的用例究竟是什么,但这里可能会发生虚拟性是多余的(可能不是)。如果本质上不需要虚拟性,您可以在此处使用std::enable_if,如解释there
  • 虚函数是为了让我可以使用多态性来提供container_intf类型的不同实现。除了需要用户调用“get().get()...”的嵌套容器外,这一切都很好。正如我最初的问题中提到的,我尝试了 enable_if,但它不适用于创建递归“get”方法。
猜你喜欢
  • 1970-01-01
  • 2018-09-12
  • 2016-07-12
  • 2020-10-05
  • 1970-01-01
  • 2021-11-01
  • 2017-08-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多