【Poco】Poco::Any的例子

#include "../tmain.hpp"

class SomeClass
{
public:
	int i;
	std::string str;
	SomeClass(int h, std::string s): i (h), str(s)
	{
		PRINT_DEBUG("SomeClass Construct ..." << " " << this);
	};
	SomeClass(const SomeClass& sc)
	{
		PRINT_DEBUG("Copy SomeClass Construct ..." << " " << this);
		PRINT_DEBUG("Copy SomeClass Construct ..." << " " << &sc);
		this->i = sc.i;
		this->str = sc.str;
	};
	virtual ~SomeClass()
	{
		PRINT_DEBUG("SomeClass Deconstruct ..." << " " << this);
	};
	bool operator==(const SomeClass& other) const
	{
		return i == other.i && str == other.str;
	};
};

void test_any_int()
{
	Poco::Any a = 1234567890;
	int* i = Poco::AnyCast<int>(&a);
	assert(a.type() == typeid(int));
	assert(*i == 1234567890);

	// 复制构造
	Poco::Any b = a;
	int* copyi = Poco::AnyCast<int>(&b);
	assert(b.type() == typeid(int));
	assert(*i == *copyi);

	// string转换后为空
	std::string* s = Poco::AnyCast<std::string>(&a);
	assert(s == NULL);

	// 为空的原因,是因为AnyCast转换前有进行类型判断,会抛出异常。
	try
	{
		std::string s = Poco::AnyCast<std::string>(a);
	}
	catch (Poco::BadCastException&)
	{
		PRINT_DEBUG("BadCastException...");
	}
}

void test_complex_type()
{
	SomeClass sc(13, std::string("Hello World."));
	Poco::Any a = sc;
	PRINT_DEBUG(&a);
	Poco::Any b = a;
	assert(a.type() == typeid(SomeClass));
	assert(b.type() == typeid(SomeClass));

	SomeClass sc2 = Poco::AnyCast<SomeClass>(a);
	assert(sc == sc2);
	assert(&sc != &sc2);

	SomeClass& scRef = Poco::RefAnyCast<SomeClass>(a);
	const SomeClass& scCRef = Poco::RefAnyCast<SomeClass>(a);
	assert(sc == scCRef);
	assert(&sc != &scCRef);
	assert(&scRef == &scCRef);
}

void test_any_vector()
{
	std::vector<int> tmp;
	tmp.push_back(1);
	tmp.push_back(2);
	tmp.push_back(3);

	Poco::Any a = tmp;
	assert(a.type() == typeid(std::vector<int>));

	std::vector<int>tmp2 = Poco::AnyCast<std::vector<int>>(a);
	const std::vector<int>& vecCRef = Poco::RefAnyCast<std::vector<int>>(a);
	std::vector<int>& vecRef = Poco::RefAnyCast<std::vector<int>>(a);

	vecRef[0] = 0;
	assert (vecRef[0] == vecCRef[0]);
}


你可能感兴趣的:(【Poco】Poco::Any的例子)