#include <iostream>

enum types { INTEGER, DOUBLE, BOOL, STRING };

class Descriptor {

public:
    Descriptor(types type):
        _type{type}
    {}
    types &type() { return _type; }


    virtual ~Descriptor() = default;

private:
    types _type;
};

class Number: public Descriptor {

public:
    Number(types descType):
        Descriptor(descType)
    {}

    virtual ~Number() = default;

    int intValue;
};


void printValue(Descriptor &t) {

  auto cast = dynamic_cast<Number *>(&t);
  if (cast == nullptr) {
    std::cout << "Err" << std::endl;
  } else {
    std::cout << "Works" << std::endl;
  }
}


int main() {

  Number t =  Number(INTEGER);
  t.intValue = 1;

  printValue(t);
}
