iota
функция была раньше в <algorithm>
заголовок. Это было изменение в <numeric>
,
Мне нужно сохранить старый способ обратной совместимости, поэтому я хотел бы использовать опцию препроцессора, чтобы выбрать правильный заголовок для включения.
Когда это изменилось и какую опцию препроцессора я должен использовать?
йота (от греческого ι) был вновь введен в <numeric>
когда C ++ 11 прибыл, как вы можете видеть в ссылка. Таким образом, вы проверяете, находитесь ли вы в среде без него, и включаете старый заголовок, или еще, включаете новый заголовок.
Нечто подобное может сработать:
#if __cplusplus <= 199711L
#include <algorithm>
#else
#include <numeric>
#endif
C ++ 11 устанавливает значение __cplusplus
в 201103L
, Это подтверждает полное соответствие стандарту 2011 года; это не говорит вам о частичном соответствии или расширениях компилятора. Если __cplusplus
установлен на 201103L, тогда либо компилятор полностью соответствует, либо он обманывает вас. Если это не так, то вы не можете сказать, какие функции он поддерживает.
Узнайте больше в этом ответ.
Более того, это Quora сообщение также согласен с изменением (или, если честно; повторно ввести) std::iota
случилось с C ++ 11.
Если вы можете себе это позволить, просто включите обе библиотеки.
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>
,
Что вы хотите сделать, это проверить, если __cplusplus
переменная ниже определенной точки, и если это #include <algorithm>
если нет то #include <numeric>
#if __cplusplus <= 199711L
#include <algorithm>
#else
#include <numeric>
#endif
Это должно работать практически для любой библиотеки, с которой вам нужно это сделать, просто отметьте, что вам, возможно, придется изменить 199711L
на соответствующий номер.