STL йота включить изменение файла

iota функция была раньше в <algorithm> заголовок. Это было изменение в <numeric>,

Мне нужно сохранить старый способ обратной совместимости, поэтому я хотел бы использовать опцию препроцессора, чтобы выбрать правильный заголовок для включения.

Когда это изменилось и какую опцию препроцессора я должен использовать?

2

Решение

йота (от греческого ι) был вновь введен в <numeric> когда прибыл, как вы можете видеть в ссылка. Таким образом, вы проверяете, находитесь ли вы в среде без него, и включаете старый заголовок, или еще, включаете новый заголовок.

Нечто подобное может сработать:

#if __cplusplus <= 199711L
#include <algorithm>
#else
#include <numeric>
#endif

устанавливает значение __cplusplus в 201103L, Это подтверждает полное соответствие стандарту 2011 года; это не говорит вам о частичном соответствии или расширениях компилятора. Если __cplusplus установлен на 201103L, тогда либо компилятор полностью соответствует, либо он обманывает вас. Если это не так, то вы не можете сказать, какие функции он поддерживает.

Узнайте больше в этом ответ.

Более того, это Quora сообщение также согласен с изменением (или, если честно; повторно ввести) std::iota случилось с .


Если вы можете себе это позволить, просто включите обе библиотеки.

1

Другие решения

iota никогда не был «перемещен» из <algorithm>, C ++ 03 не имеет std::iota в любом заголовке, и никакая соответствующая реализация не может обеспечить это, потому что iota не является зарезервированным именем, и это необходимо для работы:

#define iota arbitrary preprocessing token sequence like this and *that and "!" and \
-13833rfa231fn7or.other.line.noise.that.happens.to.be.a.pp.number
#include <every-standard-header-here>

Он был добавлен в <numeric> в C ++ 11 и был в SGI STL«s <numeric> тоже как продолжение. Никогда не был в <algorithm> и поэтому не может быть удален от этого.

Теперь, поскольку заголовки стандартной библиотеки могут включать друг друга произвольным образом, случается, что GCC <= 5 <algorithm> в режиме C ++ 11 включен <random> по случайности, которая включала <numeric> по случайности. Это просто деталь реализации, на которую вы не должны полагаться, и GCC 6 больше не делает этого. Исправление для этого состоит в том, чтобы просто включить правильный заголовок, который есть, и всегда был, <numeric>,

4

Что вы хотите сделать, это проверить, если __cplusplus переменная ниже определенной точки, и если это #include <algorithm> если нет то #include <numeric>

#if __cplusplus <= 199711L
#include <algorithm>
#else
#include <numeric>
#endif

Это должно работать практически для любой библиотеки, с которой вам нужно это сделать, просто отметьте, что вам, возможно, придется изменить 199711L на соответствующий номер.

1
По вопросам рекламы [email protected]