【发布时间】: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