C++、正向声明和递归数据类型
C++, forward declaration and recursive data types
我希望能够有一个映射,其中的值是指向映射的指针。类似的东西
std::map<KeyType, const_pointer_to_this_map's_value_type>
我知道我可以使用const void*而不是const_pointer_to_this_map's_value_type。
我看到了循环数据类型定义的技巧,例如https://gist.github.com/tivtag/1208331或http://qscribble.blogspot.fr/2008/06/circular-template-references-in-c.html但我不确定它们是否以及如何适用于我的案件。
在那里,它们使用自己的类(Vertex和Edge;A和B),但在这里,std::map和std::map::value_type已经在STL标头中定义,我不能只用Combo类实例化它们。
有没有办法定义上面的地图?
只需将其包装在一个结构中。你需要给类型一个名称,以便能够引用它。
template<class T>
class Graph {
std::map<T, const Graph<T>*> data;
public:
// ...
};
在C++11中,您还可以使用带有前向声明的typedef的模板别名:
namespace {
template<class T>
struct GraphWrap {
class type;
typedef std::map<T, const typename GraphWrap<T>::type*> type;
};
}
template<class T>
using Graph = typename GraphWrap<T>::type;
当然,在这里使用std::map
可能有点误导,因为您使用的是键类型参数作为容器的值类型。就像Mooing Duck所说的,你似乎在建模一个有向图,其中每个节点最多有一条传出边。如果你想用图做一些事情,有一些图库——如果你在做其他事情,或者你只是想学习,那就另当别论了。
来源http://www.sgi.com/tech/stl/Map.html
Map是一个成对关联容器,这意味着它的值类型是
pair<const Key, Data>
std::map<K, M>::value_type
总是std::pair<K, M>
,所以:
#include <map>
typedef int KeyType;
struct MappedType
{
const std::pair<const KeyType, MappedType>* p;
};
void g()
{
std::map<KeyType, MappedType> m;
m[0].p = 0;
m[1].p = &(*m.find(0));
}
相关文章:
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 此递归模板类型定义是否有效C++?
- C++ 递归函数类型
- 我如何实现递归函数的模板,该模板允许C 中的许多不确定数据类型的参数
- 递归模板类型
- 使用递归将数据类型放入数组中
- variadic模板递归返回类型扣除汇编误差
- 协议缓冲区、Apache Thrift或任何其他数据结构序列化协议中的递归数据结构
- boost::variant:具有递归向量类型的奇怪行为
- 递归类型真的是构建不连续的任意大小数据结构的唯一方法吗
- 递归数据结构的前向声明
- C++递归模板类型推导
- 模板化的递归数据类型
- 容器/类型名称转发的递归模板类型
- 共享指针递归地删除递归数据结构,堆栈溢出
- C++、正向声明和递归数据类型
- 模板递归区分boot::元组中的数据类型
- 如何避免简单的递归模板类型定义
- 如何在可变模板上生成递归数据结构
- 在<T>递归数据结构中移动unique_ptr数组