Можно ли определить, является ли тип неполным без сбоя компиляции?
Я хочу добиться такого поведения, как 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 ответа
Используйте 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) и clang 2.9, но не на gcc 4.3)
Не пытайтесь сделать это.
Это принципиально несостоятельно. Шаблоны параметризованы типами, а не точкой создания. Тип класса не завершен или не сам по себе, он завершается в какой-то момент во время перевода.
Шаблон, созданный в некоторых типах, должен иметь одинаковую семантику в каждом экземпляре.
Если нет, то поведение не определено.