模板化的递归数据类型
templated recursive data types
我有一个递归数据类型,如下所示:
template<typename T>
struct SomeType {
std::map<T, SomeType<T>> mapping;
};
SomeType<int> foo;
这很好,但是用std::unordered_map
替换std::map
会由于类型不完整而导致编译错误。我(或gcc)在哪里出错了吗?还是这只是标准的一部分?
我也想让内部容器由模板参数(如std::stack
和std::queue
)确定,但我无法找到实现这一点的方法,因为这需要已经定义SomeType。
不完整的示例:
template<typename T, typename C = std::map<T, SomeType<[???]>>>
struct SomeType {
C mapping;
};
SomeType<int, [???]> foo;
我知道这可以通过运行时间接实现,但这不是我想要的。
您的类在其定义的最终}
之前的任何位置都是不完整的。因此,mapping
成员在其类型的模板参数中使用了不完整的类型SomeType
。
该标准不允许这样做,而且它与一些STL容器一起工作纯属运气。
你的第二个问题属于相同的答案——首先这样做是违法的。
由于明显的原因,不能用递归默认参数定义模板。您也不能在不完整的类型上实例化标准库容器模板,因为标准是这么说的(否则就是未定义的行为)。不过,通常的PIMPL习惯用法可能会有所帮助:
#include <map>
#include <memory>
template <typename T> class SomeType
{
typedef std::map<T, SomeType<T>> map_type;
typedef std::unique_ptr<map_type> map_ptr;
map_ptr pimpl;
public:
SomeType() : pimpl(new map_type) { }
};
虽然不能对容器使用不完全类型,但可以使用智能指针。虽然你不能用未定义的类型参数创建模板类型,但你可以在这里使用一些技巧:
template<typename T, template <typename U, typename V, typename... Args> class Container = std::unordered_map >
struct SomeType {
Container<T, std::unique_ptr<SomeType> > mapping;
};
相关文章:
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 此递归模板类型定义是否有效C++?
- C++ 递归函数类型
- 我如何实现递归函数的模板,该模板允许C 中的许多不确定数据类型的参数
- 递归模板类型
- 使用递归将数据类型放入数组中
- variadic模板递归返回类型扣除汇编误差
- 协议缓冲区、Apache Thrift或任何其他数据结构序列化协议中的递归数据结构
- boost::variant:具有递归向量类型的奇怪行为
- 递归类型真的是构建不连续的任意大小数据结构的唯一方法吗
- 递归数据结构的前向声明
- C++递归模板类型推导
- 模板化的递归数据类型
- 容器/类型名称转发的递归模板类型
- 共享指针递归地删除递归数据结构,堆栈溢出
- C++、正向声明和递归数据类型
- 模板递归区分boot::元组中的数据类型
- 如何避免简单的递归模板类型定义
- 如何在可变模板上生成递归数据结构
- 在<T>递归数据结构中移动unique_ptr数组