Как сделать запрос для всех базовых классов во время компиляции? - PullRequest
3 голосов
/ 12 марта 2011

С std::is_base_of<A,B>::value можно проверить, является ли класс A базовым классом класс B. Можно ли также запросить компилятор для всех базовых классов класса B, например, что-то вроде base_classes_of<B>, возвращающее кортеж std ::, содержащий все базовые классы B?

Есть ли евтл. нестандартное расширение в 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() {}

Ответы [ 3 ]

2 голосов
/ 13 марта 2011

Аналогичные объекты bases и direct_bases были предложены в N2965 .
Что касается элементов данных, так как элементы данных могут быть битовыми полями, их типовые характеристики есть некоторые тонкости.
С другой стороны, у базовых классов таких проблем нет.
Я думаю, что есть спрос на некоторые запросы во время компиляции, такие как bases в некоторых ситуациях, как упомянуто в Мотивирующих примерах из N2965.
Однако, к сожалению, в текущем C ++ его просто нет, и, насколько я видел, GCC и Clang-C ++ в данный момент не предоставляют аналогичные возможности ...

1 голос
/ 12 марта 2011

Невозможно запросить программу C ++ для базовых типов заданного типа - фактически невозможно запросить программу C ++ для чего-либо .... Однако вы можете написать мета-предикат, который запрашивает известный типк списку типов (или пакету параметров) известных типов (или наоборот) и генерирует тип true или false при типе компиляции - он просто рекурсивно применяет мета-предикат std::is_base_of ко всем типам в пакете параметров и накапливает результаты,Это единственный способ, которым я могу думать.Я мог бы раскрутить некоторый код, который делает это, но я сомневаюсь, что это то, что вы действительно хотите.На самом деле вопрос заключается в следующем: зачем вам это нужно, или лучше, зачем вам это нужно в C ++?

1 голос
/ 12 марта 2011

Нет, это невозможно в стандартном C ++, но для вашей предполагаемой цели вы можете просто использовать отдельные утверждения, по одному для каждого базового класса, который вам необходим (или обернуть это списком типов).

Приветствия& hth.,

...