2010-05-09 4 views
5

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 особенности для приведенного выше определения, если все возможно.

+3

Большая часть Boost реализована в файлах заголовков, а не в объектных файлах. Поэтому, если вы придерживаетесь тех, вы не платите штраф за то, что вы не используете, и не для большинства вещей, которые вы используете, если на то пошло. –

+0

Это больше зависит от зависимости (даже если почти все используют Boost в любом случае). Возможно, я мог бы вырвать соответствующую часть Boost, но так как моя библиотека похожа на 3 заголовка ... – doublep

+0

Кажется, трудно проверить, существует ли тип. Но тогда, если нет конструктора перемещения, не будет ли C++ 0x автоматически автоматически возвращаться к копированию? Или, если важна важная часть, не трудно ли представить себе класс, в котором копирование безопаснее, чем перемещение (если последнее не отмечено nothrow)? – UncleBens

ответ

1

boost::variant имеет реализацию has_nothrow_move для собственного внутреннего использования - вы можете использовать это, хотя оно не так надежно, как правильная реализация компилятора. Источником для этого является here - Я не знаю, насколько он надежный, поэтому YMMV.

Кроме того, вы можете проверить макросы компилятора (__GNUC__ and __GNUC_MINOR__), чтобы определить наличие и заглушить его, если нет. К сожалению, кажется, что has_nothrow_move_constructor не поддерживается в любой выпущенной версии G ++, поэтому вам придется немного подождать, прежде чем вы узнаете, какую версию использовать.

Смежные вопросы