GCC до 4.5 не имеет стандартного шаблона признаков типа C++ 0x has_nothrow_move_constructor
. Я мог бы использовать его в своем пакете для оптимизации, но я не хочу исключать один из распространенных компиляторов и не хочу перегружать конфигурацию такими символами, как HAVE_STD_HAS_NOTHROW_MOVE_CONSTRUCTOR
. Возможно ли использовать этот шаблон, если он есть, и просто вернуться к копированию, если нет без, используя любые предопределенные символы конфигурации? Я также не хочу зависеть от Boost, поскольку моя библиотека небольшая и не нуждается в Boost по каким-либо другим причинам.Обнаружение присутствия шаблона во время компиляции
В псевдокоде, мне нужно что-то вроде:
template <typename type>
struct has_nothrow_move_constructor_robust
: public integral_constant <bool,
/* if possible */ has_nothrow_move_constructor <type>::value
/* otherwise */ false>
{ };
С ходом конструкторов только для C++ 0x в любом случае, я не против использовать другие C++ 0x особенности для приведенного выше определения, если все возможно.
Большая часть Boost реализована в файлах заголовков, а не в объектных файлах. Поэтому, если вы придерживаетесь тех, вы не платите штраф за то, что вы не используете, и не для большинства вещей, которые вы используете, если на то пошло. –
Это больше зависит от зависимости (даже если почти все используют Boost в любом случае). Возможно, я мог бы вырвать соответствующую часть Boost, но так как моя библиотека похожа на 3 заголовка ... – doublep
Кажется, трудно проверить, существует ли тип. Но тогда, если нет конструктора перемещения, не будет ли C++ 0x автоматически автоматически возвращаться к копированию? Или, если важна важная часть, не трудно ли представить себе класс, в котором копирование безопаснее, чем перемещение (если последнее не отмечено nothrow)? – UncleBens