このプロジェクトでは、コンパイラがまだサポートしていないため、C++ 11の機能(例:decltype
)を使用できません。私は、C++で基本クラスの型を取得するにはどうすればよいですか?
class Foo: private Bar<Foo> {
MAGIC //expands to using Bar<Foo>::Baz; and some others
public:
void otherFunction();
//... the rest of the class
};
理想等、class
宣言をドレッシングまたは中括弧を隠すことなく、引数(下記参照)することなく、好ましくは、マクロ内で、テンプレートパラメータとして現在のクラスを提供することができるようにする必要これはQtのQ_OBJECT
マクロのように動作しますが、別の事前コンパイルステップとそれに関連する生成クラスは導入されていません。 typeid
は実行時に役立つかもしれませんが、私の目標はビルド時にこれをすべて達成することです。
MAGIC
マクロを書くたびに、毎回クラス名を繰り返す必要はありません。私は、任意の言語があるとは思わない
#include <iostream>
template <typename S>
struct Base : public S {
using super = S;
};
template <typename T>
class Bar
{
public:
virtual void f() { std::cout << "Bar" << std::endl; }
};
class Foo : private Base<Bar<int>>
{
public:
virtual void f()
{
std::cout << "Foo";
super::f(); //Calls Bar<int>::f()
}
};
class Fii : private Base<Foo>
{
public:
virtual void f()
{
std::cout << "Fii";
super::f(); //Calls Foo::f()
}
};
int main()
{
Fii fii;
fii.f(); //Print "FiiFooBar"
return 0;
}
この質問は「C++で自律型の「self」メンバ型を実装できますか?」(http://stackoverflow.com/q/21143835/)のC++ 03バージョンと思われます。 560648) " –
タイトルを* base clase *に変更すると気になりますか? *クラスを囲むことは、あなたがネストしているように聞こえるし、外側のクラスからどんなタイプになっているかのように思えます。 – NathanOliver
'self'の質問は非常によく似ていますが、あなたが指摘したように、C++ 03で提案されている解決策のようには見えません。 タイトルをもっと明確にするには、確かにタイトルを変更してください。 – multipleinterfaces