Advertisement
alfps

DIY discriminated variant example

Mar 19th, 2021
469
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.38 KB | None | 0 0
  1. #include <string>
  2. #include <utility>
  3.  
  4. namespace my{
  5.     using std::string;
  6.     using std::move;
  7.    
  8.     class Var
  9.     {
  10.         enum{ void_var, string_var, int_var } m_kind;
  11.         union
  12.         {
  13.             string  m_s;
  14.             int     m_x;
  15.         };
  16.  
  17.     public:
  18.         ~Var()
  19.         {
  20.             using Int = int;
  21.             switch( m_kind ) {
  22.                 case string_var:    m_s.string::~string();  break;
  23.                 case int_var:       m_x.Int::~Int();  break;
  24.                 default:            {}
  25.             }
  26.         }
  27.  
  28.         Var(): m_kind( void_var ) {}
  29.         Var( string s ): m_kind( string_var ), m_s( move( s ) ) {}
  30.         Var( const int x ): m_kind( int_var ), m_x( move( x ) ) {}
  31.  
  32.         template< class Type >
  33.         inline auto get() -> Type*;
  34.     };
  35.  
  36.     template<>
  37.     auto Var::get<int>()
  38.         -> int*
  39.     { return (m_kind == int_var? &m_x : nullptr); }
  40.  
  41.  
  42.     template<>
  43.     auto Var::get<string>()
  44.         -> string*
  45.     { return (m_kind == string_var? &m_s : nullptr); }
  46. }  // namespace my
  47.  
  48. #include <kickstart/all.hpp>
  49. using namespace kickstart::all;
  50.  
  51. auto main() -> int
  52. {
  53.     my::Var v = "Blah blah"s;
  54.     if( int* px = v.get<int>() ) {
  55.         out << "int: " << *px << "." << endl;
  56.     } else if( string* ps = v.get<string>() ) {
  57.         out << "string: “" << *ps << "”." << endl;
  58.     }
  59. }
  60.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement