I am trying to create an easy-to-use interface for array indexing in C++. Unfortunately, I just cannot get my code working. And I think the problem is regrading to C++ does not allow me to cast a base class back to the derived class. However, I am not sure why that happens. Please help me with that.
Here is the code.
#include <iostream>
#include <vector>
enum index_type {
single_value,
sequence,
};
class idx {
protected:
index_type t;
public:
idx(index_type _t);
virtual void print_out();
};
class single_idx:public idx {
private:
int sidx;
public:
single_idx(int _sidx);
void print_out();
};
class multiple_idx:public idx {
private:
std::vector<int> midx;
public:
multiple_idx(std::vector<int> _midx);
void print_out();
};
idx::idx(index_type _t):t(_t){
switch (t) {
case (single_value):{
std::cout << "single_value\n";
break;
}
case (sequence):{
std::cout << "multiple_value\n";
break;
}
}
}
single_idx::single_idx(int _sidx):sidx(_sidx), idx(single_value){}
multiple_idx::multiple_idx(std::vector<int> _midx):midx(_midx), idx(sequence){}
void idx::print_out() {
std::cout << "lalala\n";
switch (t) {
case (single_value):{
std::cout << "casting to single\n";
dynamic_cast<single_idx*>(this)->print_out(); // ERROR happens here!!!
break;
}
case (sequence):{
std::cout << "casting to multiple\n";
dynamic_cast<multiple_idx*>(this)->print_out();
break;
}
}
}
void single_idx::print_out() {
std::cout << "single value: ";
std::cout << sidx << "\n";
}
void multiple_idx::print_out() {
std::cout << "multiple value: ";
for (int i : midx) {
std::cout << i << " ";
}
std::cout << "\n";
}
void f(std::initializer_list<idx> a) {
for (idx t : a) {
t.print_out();
}
}
int main()
{
f({single_idx(1), single_idx(2)});
}