最近、任意のデータ型 (uint8、unint16、uint32、または unint64) である単一のオブジェクトが必要なプロジェクトに取り組むことにしました (これらは数値のみであり、 +、-、*、/、<<、>>.Boost::variant を調べたのですが、試してみたところ、データを正しく取得できず、落胆しました。そのため、これをエミュレートする他の方法を検討しました。
この点より下は実験であり、間違っているようです。非常に間違っています。
(私はポリモーフィズム/継承についてあまり詳しくないので、事前に申し訳ありません) ベース オブジェクトを作成しようとしましたが、ベース オブジェクトを派生クラス (派生テンプレート クラス) に設定しました。選択したデータ型 (uint8、uint16、uint32、または uint64) です。その後、get() メソッドを使用して以前に設定したデータを簡単に取得できます。
DynamicVariable *a = new TypedDynamicVariable<unsigned int>(12345);
std::cout << a->get() << std::endl;
delete a;
また:
DynamicVariable *a = new TypedDynamicVariable<unsigned char>(255);
std::cout << a->get() << std::endl;
delete a;
表現例:
unsigned int a = 100;
unsigned char b = 20;
std::cout << a + b << std::endl;
結果: エラー C2039: 'get' : 'DynamicVariable' のメンバーではありません
a->get() が BASE クラスに存在しないというエラーが表示されます。オンラインで検索して、このコード (dynamic_cast) を見つけました。
DynamicVariable *a = new TypedDynamicVariable<int>(12345);
TypedDynamicVariable<int>* p = dynamic_cast<TypedDynamicVariable<int>*>(a);
std::cout << p->get() << std::endl;
ご覧のとおり、これは TypedDynamicVariable* < int > * and dynamic_cast*>(a) (INT であることを指定する) であり、私がやりたいことの目的全体を無効にします。
以下は、私がオンラインで何時間も読んだ不確かな時間から、一種のハッキングしたクラスです。それは私の「解決策」の一般的な概要を持っているようですが、重要なコンテンツが欠落している/改善が必要であること、または実際にはポリモーフィズムが結局私が望むものではない/使用できないことを知っています.
class DynamicVariable
{
public:
//constructor & virtual destructor
DynamicVariable() {}
virtual ~DynamicVariable() {}
};
//unique data
template<typename T>
class TypedDynamicVariable : public DynamicVariable
{
private:
T _data;
public:
//constuctor
TypedDynamicVariable (const T& data) : _data(data) { }
//prototypes
void set (const T& data) { _data = data; }
T get (void) { return _data; }
};
誰かが上記のクラスの何が問題なのかを理解し、実際の解決策に導くのを手伝ってくれるか、本当に私が探していたものである場合は、boost::variant で正しい方向に向けてください。
ありがとう。