Skip to content

Instantly share code, notes, and snippets.

@RushOnline
Created March 18, 2015 19:37
Show Gist options
  • Save RushOnline/8b7bac44cdf89e752666 to your computer and use it in GitHub Desktop.
Save RushOnline/8b7bac44cdf89e752666 to your computer and use it in GitHub Desktop.
C++ variant template
#include <memory>
#include <string>
class variant
{
public:
template <class T>
variant& operator = (T const& t)
{
typedef type<T> assign_type;
object = std::auto_ptr<assign_type>(new assign_type(t));
return *this;
}
template <class T>
operator T ()
{
typedef type<T> assign_type;
assign_type& type = dynamic_cast<assign_type&>(*object);
return type.get();
}
private:
class base
{
public:
virtual ~base() {}
};
typedef std::auto_ptr<base> base_ptr;
template <class T>
class type : public base
{
public:
type(T const& t)
: object(t)
{
}
T get() const
{
return object;
}
private:
T object;
};
base_ptr object;
};
struct dummy
{
int a;
int b;
int c;
};
int main()
{
variant v1, v2, v3, v4;
v1 = 2;
v2 = 5.0f;
v3 = std::string("Pot of gold");
v4 = dummy();
int i = v1;
float f = v2;
std::string s = v3;
dummy d = v4;
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment