Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <string>
- #include <utility>
- namespace my{
- using std::string;
- using std::move;
- class Var
- {
- enum{ void_var, string_var, int_var } m_kind;
- union
- {
- string m_s;
- int m_x;
- };
- public:
- ~Var()
- {
- using Int = int;
- switch( m_kind ) {
- case string_var: m_s.string::~string(); break;
- case int_var: m_x.Int::~Int(); break;
- default: {}
- }
- }
- Var(): m_kind( void_var ) {}
- Var( string s ): m_kind( string_var ), m_s( move( s ) ) {}
- Var( const int x ): m_kind( int_var ), m_x( move( x ) ) {}
- template< class Type >
- inline auto get() -> Type*;
- };
- template<>
- auto Var::get<int>()
- -> int*
- { return (m_kind == int_var? &m_x : nullptr); }
- template<>
- auto Var::get<string>()
- -> string*
- { return (m_kind == string_var? &m_s : nullptr); }
- } // namespace my
- #include <kickstart/all.hpp>
- using namespace kickstart::all;
- auto main() -> int
- {
- my::Var v = "Blah blah"s;
- if( int* px = v.get<int>() ) {
- out << "int: " << *px << "." << endl;
- } else if( string* ps = v.get<string>() ) {
- out << "string: “" << *ps << "”." << endl;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement