После ответа this вопрос Я пытался найти шаблон is_complete
в библиотеке Boost, и я понял, что такого шаблона в Boost.TypeTraits нет. Почему в библиотеке Boost нет такого шаблона? Как это должно выглядеть?Как написать шаблон `is_complete`?
//! Check whether type complete
template<typename T>
struct is_complete
{
static const bool value = (sizeof(T) > 0);
};
...
// so I could use it in such a way
BOOST_STATIC_ASSERT(boost::is_complete<T>::value);
Код выше не является правильным, потому что это незаконно, чтобы применить sizeof
к неполному типу. Что будет хорошим решением? Возможно ли применить SFINAE в этом случае?
Ну, эта проблема не может быть решена в общем, не нарушая ODR rule, но есть там конкретная платформа solution, которая работает для меня.
Я думаю, что это не может работайте в принципе (за исключением случаев, когда вы всегда применяете его к типу, который всегда остается неполным или всегда завершен). Поскольку 'U' завершен или нет,' is_complete 'всегда указывает тот же самый тип. Если вы сейчас перейдете и используете 'is_complete ' в двух разных единицах перевода, член значения, возможно, будет иметь различное значение каждый раз, а компилятор свободен в том, какое значение он использует. Это неправда, я думаю, но я не могу найти утверждение стандарта об этом :(Был бы рад, если бы вы могли это выяснить. –
. Чем больше вопрос, почему. Без рефлексии почему вам это нужно, поскольку компилятор знает об этом время компилятора –
В C++ 03 также нет способа сделать это. Atmost с C++ 0x с «sfinae для выражений», но даже тогда, если вы передаете 'vector' например, и 'vector' объявлен только но не определено, тогда проверка полноты приведет к неявному экземпляру, и если определение не доступно, выдается жесткая ошибка, которая не покрывается sfinae (ошибка не находится в «непосредственном контексте»). –