Безопасно ли определять _HAS_TRADITIONAL_STL для включения функциональности STL? - PullRequest
3 голосов
/ 24 марта 2010

Пытаясь использовать std::select1st из <functional> в проекте VS2008, я обнаружил, что он был защищен _HAS_TRADITIONAL_STL охранником.

  • Есть ли причина для этого?

  • Безопасно ли просто определить _HAS_TRADITIONAL_STL перед включением <functional>?

1 Ответ

7 голосов
/ 24 марта 2010

Причина std::select1st по умолчанию отсутствует в том, что она не является частью стандартной библиотеки C ++. Это одна из частей Стандартной библиотеки шаблонов (STL), которая не была принята в стандарт C ++.

Я не могу найти документацию по MSDN для _HAS_TRADITIONAL_STL, и она, похоже, не используется в версии стандартной библиотеки, поставляемой с Visual Studio 2010. Возможно, она включена в библиотеку Dinkumware, когда они доставьте его в Microsoft.

Как уже было сказано, вероятно безопасно определить, если вы хотите использовать std::select1st. Просто отметьте, что использование всего, что разрешено этим флагом, зависит от реализации и не переносимо (и может даже меняться в разных версиях Visual C ++). Возможно, вам лучше реализовать собственную функцию select1st:

template <typename PairT>
struct select1st : public std::unary_function<PairT, typename PairT::first_type>
{
    typename PairT::first_type operator()(const PairT& a) { return a.first; }
};
...