私はタプルのようなデータ構造を試してきました。オブジェクトの各タイプは1つだけで、各オブジェクトはCスタイルのPODSでなければなりません。それはそれが保持するオブジェクトにアクセスする奇妙な方法を使用します。そこから派生するクラスへの参照を返します。同様に:親クラスへの参照を戻すC++
template<class... Ts>
class Container : private Ts...
{
public:
template<class T>
T& get_component()
{ //returns reference to base class specified by T
return static_cast<T&>(* const_cast<Container<Ts...> *>(this));
}
};
そして、このように使用されることを意図:
struct A { int x, y; };
struct B { float x, y; };
int main()
{
using namespace std;
Container<A, B> foo;
A& a_ref = foo.get_component<A>();
a_ref.x = 5;
a_ref.y = 10;
const B& b_ref = foo.get_component<B>();
cout << b_ref.x << endl;
cout << b_ref.y << endl;
}
私が使用する方法は、T &にそれをstatic_castsよりも、それを逆参照、これをconst_castをしなければなりません。私が使っているテクニックに落とし穴がありますか?私が試したテストでは、このデザインは期待どおりに動作するようです。
編集: const_castは冗長です。私はこのポインタへの参照を割り当てるという誤解を持っていました。私はちょうどstatic_casting T &これを逆参照する必要があります。
なぜ最初に 'const_cast'を使用していますか?あなたは同じタイプにキャストしているだけです。 – 0x499602D2
'const'を追加したい場合は' static_cast'を使うことができます – krzaq
@krzaqあるいは戻り値の型を 'const T&'に変更して関数 'const'を作るだけです – user4407569