3

クラスが class の基底クラスであるかどうかをstd::is_base_of<A,B>::value確認できます。class のすべての基本クラスをコンパイラに照会することも可能 ですか?たとえば、のすべての基本クラスを含む std::tuple を返すようなものですか?ABBbase_classes_of<B>B

evtlはありますか?これを達成できるg ++の非標準拡張機能?

これがまったく不可能な場合、誰かがその理由を知っていますか? コンパイラが簡単に利用できるはずのかなり基本的な情報のように聞こえますか?

例:

#include <type_traits>
#include <tuple>

struct A {};
struct B : A {};

static_assert(std::is_base_of<A, B>::value, "A is base of B");
static_assert(! std::is_base_of<B, A>::value, "but B is not base of A");

// now I am looking for something like
// typedef base_classes_of<B>::type B_bases;
// static_assert(std::is_same<B_bases, std::tuple<A>>::value, "all bases of B are: A");

int main() {}
4

3 に答える 3

2

同様の施設がN2965basesdirect_bases提案され ました。 データ メンバーに関しては、データ メンバーはビット フィールドになる可能性があるため、その型の特性にはいくつかの微妙な点があります。 一方、基本クラスにはそのような問題はありません。N2965 の動機付けの例で 述べたように、状況によっては コンパイル時のクエリが必要になると思います。 ただし、残念ながら、現在の C++ にはそれが欠けているだけであり、私が見た限りでは、GCC と Clang-C++ は現時点では同様の機能を提供していないようです...


bases

于 2011-03-12T23:54:29.403 に答える
1

いいえ、標準のC ++では不可能ですが、目的に応じて、存在する必要のある基本クラスごとに1つずつ、個別のアサートを使用できます(またはタイプリストでラップします)。

乾杯&hth。、

于 2011-03-12T08:30:38.447 に答える
1

特定の型の基本型について C++ プログラムにクエリを実行することはできません。実際には、C++ プログラムにクエリを実行することはできません。既知の型のリスト (またはパラメーター パック) (またはその逆) を生成し、コンパイル タイプで true または false の型を生成しますstd::is_base_of。パラメーター パック内のすべての型にメタ述語を再帰的に適用し、結果を蓄積します。これが私が考えることができる唯一の方法です。それを行うコードをいくつかスピンすることはできますが、それがあなたが本当に望んでいることだとは思えません。本当に問題なのは、なぜそれを行う必要があるのか​​、それとも C++ でなぜそれを行う必要があるのか​​ということです。

于 2011-03-12T10:00:24.610 に答える