Можно ли определить, является ли тип неполным без сбоя компиляции? - PullRequest
4 голосов
/ 09 декабря 2011

Я хочу добиться такого поведения, что sizeof (complete_type) будет возвращать реальный sizeof, а sizeof (incomplete_type) - будет просто 0

Мне нужно это, чтобы предоставить расширенную информацию о типе времени выполнения для IPC (межпроцессный)) связь со структурой описания для каждого типа:

struct my_type_info
{
    bool   is_pointer;
    size_t size;         //for double* will be 4 on i386. that is sizeof(double*)
    size_t base_size;    //for double* will be 8. that is sizeof(double)
};

Проблема возникает, когда в мою систему входит что-то вроде класса MyOnlyDeclaredClass;Я получил ошибку компиляции, очевидно, по причине, что я не могу принять ее размер.

boost type_traits http://www.boost.org/doc/libs/1_48_0/libs/type_traits/doc/html/index.html предлагает много классов во время компиляции, но нет 'is_incomplete'

Интересными компиляторами являются VS2008, VS2010, clang 3, gcc-4.6, gcc-4.7

Ответы [ 2 ]

10 голосов
/ 10 декабря 2011

Не пытайтесь сделать это.

Это принципиально несостоятельно. Шаблоны параметризованы типами, а не точкой создания экземпляра. Тип класса не является полным или не сам по себе, в какой-то момент он завершается во время перевода.

Шаблон, созданный в некоторых типах, должен иметь одинаковую семантику в каждом экземпляре.

Если нет, поведение не определено.

3 голосов
/ 09 декабря 2011

Используйте SFINAE , как обычно.Это одна из возможных реализаций:

struct char256 { char x[256]; };

template <typename T>
char256 is_complete_helper(int(*)[sizeof(T)]);

template <typename>
char is_complete_helper(...);

template <typename T>
struct is_complete
{
    enum { value = sizeof(is_complete_helper<T>(0)) != 1 };
};

Пример:

#include <cstdio>

struct F;
struct G {};

int main()
{
    printf("%d %d\n", is_complete<F>::value, is_complete<G>::value);
    return 0;
}

(Примечание: работает на gcc 4.5 (нет, это не из-за C ++ 0x)и лязг 2.9, но не gcc 4.3 )

...