#include <iostream>
#include <vector>
using namespace std;
template<class NodeObjectType, class ChildNodeObjectType, class ChildNode>
class Node {
public:
Node(Node* parent, NodeObjectType* object);
ChildNode* addAsChild(ChildNodeObjectType* object);
private:
NodeObjectType* nodeObject;
std::vector<ChildNode*> children;
};
//typedef Node<B, void, void> BNode;
//typedef Node<A, B, BNode> ANode;
//typedef Node<void, A, ANode> RootNode;
/* constructor */
template<class NodeObjectType, class ChildNodeObjectType, class ChildNode>
ChildNode* Node<NodeObjectType, ChildNodeObjectType, ChildNode>::
addAsChild(ChildNodeObjectType* object)
{
ChildNode* child = new ChildNode(this, object);
children.push_back(child);
return child;
}
int main() { }
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdGVtcGxhdGU8Y2xhc3MgTm9kZU9iamVjdFR5cGUsIGNsYXNzIENoaWxkTm9kZU9iamVjdFR5cGUsIGNsYXNzIENoaWxkTm9kZT4KY2xhc3MgTm9kZSB7CnB1YmxpYzoKICAgIE5vZGUoTm9kZSogcGFyZW50LCBOb2RlT2JqZWN0VHlwZSogb2JqZWN0KTsKICAgIENoaWxkTm9kZSogYWRkQXNDaGlsZChDaGlsZE5vZGVPYmplY3RUeXBlKiBvYmplY3QpOwpwcml2YXRlOgogICAgTm9kZU9iamVjdFR5cGUqIG5vZGVPYmplY3Q7CiAgICBzdGQ6OnZlY3RvcjxDaGlsZE5vZGUqPiBjaGlsZHJlbjsKfTsKCi8vdHlwZWRlZiBOb2RlPEIsIHZvaWQsIHZvaWQ+IEJOb2RlOwovL3R5cGVkZWYgTm9kZTxBLCBCLCBCTm9kZT4gQU5vZGU7Ci8vdHlwZWRlZiBOb2RlPHZvaWQsIEEsIEFOb2RlPiBSb290Tm9kZTsKCi8qIGNvbnN0cnVjdG9yICovCgp0ZW1wbGF0ZTxjbGFzcyBOb2RlT2JqZWN0VHlwZSwgY2xhc3MgQ2hpbGROb2RlT2JqZWN0VHlwZSwgY2xhc3MgQ2hpbGROb2RlPgpDaGlsZE5vZGUqIE5vZGU8Tm9kZU9iamVjdFR5cGUsIENoaWxkTm9kZU9iamVjdFR5cGUsIENoaWxkTm9kZT46OgogIGFkZEFzQ2hpbGQoQ2hpbGROb2RlT2JqZWN0VHlwZSogb2JqZWN0KQp7CiAgICBDaGlsZE5vZGUqIGNoaWxkID0gbmV3IENoaWxkTm9kZSh0aGlzLCBvYmplY3QpOwogICAgY2hpbGRyZW4ucHVzaF9iYWNrKGNoaWxkKTsKICAgIHJldHVybiBjaGlsZDsKfQppbnQgbWFpbigpIHsgfQ==