Beispiel #1
0
int main() {
	upperPair pair1(123, namePair("aaaaa", "xxxxxxx"));
	upperPair pair2(345, namePair("bbb", "yyy"));
	cout << "no\tfirst name\tlast name\n";
	printUpperPair(pair1);
	printUpperPair(pair2);
}
void* ClassCastProvider::
cast_to_base_class(void* pDerivVoid, const ClassNameNode*& node, const std::string& baseName)
{
//	find way to base class
	std::vector<size_t> vWay;
	if(!ClassNameTreeWay(vWay, *node, baseName))
	{
		UG_ERR_LOG("ERROR in ClassCastProvider::cast_to_base_class: Request"
				" to cast from derived class '"<< node->name()<<"' to "
				" base class '"<<baseName<<"', but no such base class in"
				" registered class hierarchy.");
		throw new UGError_ClassCastFailed(node->name(), baseName);
	}

	void* currPtr = pDerivVoid;
	const ClassNameNode* pCurrNode = node;

//	cast all the way down
	while(!vWay.empty())
	{
	//	get base class to cast to
		const ClassNameNode* pBaseClassNode = &pCurrNode->base_class(vWay.back());

	//	get name pair
		std::pair<const ClassNameNode*, const ClassNameNode*> namePair(pBaseClassNode, pCurrNode);

	//	find in map
		std::map<std::pair<const ClassNameNode*, const ClassNameNode*>, CastFunc>::iterator it;
		it = m_mmCast.find(namePair);

		if(it == m_mmCast.end())
		{
			UG_ERR_LOG("ERROR in ClassCastProvider::cast_to_base_class:"
					" Request intermediate cast from derived class '" <<
					pCurrNode->name() <<"' to direct base class '"
					<<pBaseClassNode->name()<<"', but no such cast "
					" function registered.");
			throw new UGError_ClassCastFailed(node->name(), baseName);
		}

	//	get cast function
		CastFunc pCastFunc = it->second;

	//	cast
		currPtr = (*pCastFunc)(currPtr);

	//	set node to base class
		pCurrNode = pBaseClassNode;

	//	pop way
		vWay.pop_back();
	}

//	write current node on exit
	node = pCurrNode;

//	return current pointer
	return currPtr;
}