#include <iostream>
#include <memory>
#include <type_traits>
template <typename T>
void deduce_type()
{}
class any
{
/*
template <typename T, typename ... Args>
any(Args&& ... args)
: ptr_(new T(std::forward<Args>(args) ...), std::default_delete<T>())
{}
*/
public:
template <typename T>
any(T&& other)
: ptr_(new T(std::forward<T>(other))),
deduce_type_(&deduce_type<T>)
{}
template <typename T>
bool contains_type() const
{
auto cc = deduce_type<T>;
return deduce_type_ == cc;
}
private:
// std::unique_ptr<void, std::default_delete<void>> ptr_;
void* ptr_;
void(*deduce_type_)();
};
struct Foo
{
};
int main()
{
any anyInt = 16;
any anyInt2 = 17;
any anyDouble = 2.0;
any anyFoo = Foo();
bool isInt = anyInt.contains_type<int>(),
isInt2 = anyInt2.contains_type<int>(),
notDouble = anyInt.contains_type<double>(), // 0 expected
isDouble = anyDouble.contains_type<double>(),
isFoo = anyFoo.contains_type<Foo>(),
notFoo = anyInt.contains_type<Foo>(); // 0 expected
std::cout << "is int = " << isInt << std::endl;
std::cout << "is int = " << isInt2 << std::endl;
std::cout << "is not double = " << notDouble << std::endl;
std::cout << "is double = " << isDouble << std::endl;
std::cout << "is Foo = " << isFoo << std::endl;
std::cout << "is not Foo = " << notFoo << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CgkJCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgp2b2lkIGRlZHVjZV90eXBlKCkKe30KCgpjbGFzcyBhbnkKewogICAgLyoKICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSAuLi4gQXJncz4KICAgIGFueShBcmdzJiYgLi4uIGFyZ3MpCiAgICAgICAgOiBwdHJfKG5ldyBUKHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKSAuLi4pLCBzdGQ6OmRlZmF1bHRfZGVsZXRlPFQ+KCkpCiAgICB7fQogICAgKi8KCnB1YmxpYzoKCiAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KICAgIGFueShUJiYgb3RoZXIpCiAgICAgICAgOiBwdHJfKG5ldyBUKHN0ZDo6Zm9yd2FyZDxUPihvdGhlcikpKSwKICAgICAgICBkZWR1Y2VfdHlwZV8oJmRlZHVjZV90eXBlPFQ+KQogICAge30KCiAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KICAgIGJvb2wgY29udGFpbnNfdHlwZSgpIGNvbnN0CiAgICB7CiAgICAJYXV0byBjYyA9IGRlZHVjZV90eXBlPFQ+OwogICAgICAgIHJldHVybiBkZWR1Y2VfdHlwZV8gPT0gY2M7CiAgICB9Cgpwcml2YXRlOgogICAgLy8gc3RkOjp1bmlxdWVfcHRyPHZvaWQsIHN0ZDo6ZGVmYXVsdF9kZWxldGU8dm9pZD4+IHB0cl87CiAgICB2b2lkKiBwdHJfOwogICAgdm9pZCgqZGVkdWNlX3R5cGVfKSgpOwoKfTsKCnN0cnVjdCBGb28KewoKfTsKCgppbnQgbWFpbigpCnsKCiAgICBhbnkgYW55SW50ID0gMTY7CiAgICBhbnkgYW55SW50MiA9IDE3OwogICAgYW55IGFueURvdWJsZSA9IDIuMDsKICAgIGFueSBhbnlGb28gPSBGb28oKTsKCgogICAgYm9vbCBpc0ludCA9IGFueUludC5jb250YWluc190eXBlPGludD4oKSwKICAgICAgICBpc0ludDIgPSBhbnlJbnQyLmNvbnRhaW5zX3R5cGU8aW50PigpLAogICAgICAgIG5vdERvdWJsZSA9IGFueUludC5jb250YWluc190eXBlPGRvdWJsZT4oKSwgLy8gMCBleHBlY3RlZAogICAgICAgIGlzRG91YmxlID0gYW55RG91YmxlLmNvbnRhaW5zX3R5cGU8ZG91YmxlPigpLAogICAgICAgIGlzRm9vID0gYW55Rm9vLmNvbnRhaW5zX3R5cGU8Rm9vPigpLAogICAgICAgIG5vdEZvbyA9IGFueUludC5jb250YWluc190eXBlPEZvbz4oKTsgLy8gMCBleHBlY3RlZAoKICAgIHN0ZDo6Y291dCA8PCAiaXMgaW50ID0gIiA8PCBpc0ludCA8PCBzdGQ6OmVuZGw7CiAgICBzdGQ6OmNvdXQgPDwgImlzIGludCA9ICIgPDwgaXNJbnQyIDw8IHN0ZDo6ZW5kbDsKICAgIHN0ZDo6Y291dCA8PCAiaXMgbm90IGRvdWJsZSA9ICIgPDwgbm90RG91YmxlIDw8IHN0ZDo6ZW5kbDsKICAgIHN0ZDo6Y291dCA8PCAiaXMgZG91YmxlID0gIiA8PCBpc0RvdWJsZSA8PCBzdGQ6OmVuZGw7CiAgICBzdGQ6OmNvdXQgPDwgImlzIEZvbyA9ICIgPDwgaXNGb28gPDwgc3RkOjplbmRsOwogICAgc3RkOjpjb3V0IDw8ICJpcyBub3QgRm9vID0gIiA8PCBub3RGb28gPDwgc3RkOjplbmRsOwoKICAgIHJldHVybiAwOwp9