Я использую C ++ в версии Xcode 8.1. Мне нужно использовать функциональность boost::any
но я категорически против включения любой части Boost в наш проект (давайте не будем это обсуждать, пожалуйста).
я вижу это std::any
«объединен в C ++ 17» Вот.
Я хочу использовать это в моем проекте Xcode 8.1. Я пытался использовать -std=c++1z
как пользовательский флаг для проекта, но я не могу найти заголовок для него.
Как я могу использовать std::any
или же std::experimental::any
в моем проекте XCode?
Могу ли я загрузить соответствующие заголовки из реализации и добавить их в исходный код моего проекта? Или, что еще лучше, на самом деле сейчас доступно в моей версии Xcode / Clang / C ++?
Вы не можете сказать «Я хочу компилятор Xcode по умолчанию [который не поддерживает any
] «и одновременно просить его поддержать any
, Вы также не можете смешивать заголовки стандартной библиотеки для разных версий компилятора.
Вы также можете
std::any
или жеany
типаВ вашей установке нет стандарта c ++ 17. std::any
просто не доступен для вас, пока вы не получите компилятор с хотя бы экспериментальной поддержкой того, что вы хотите.
Вам бы повезло больше, просто используя boost::any
наверное.
Если вы действительно не хотите привлекать стороннюю библиотеку, реальность такова, что вы создаете свою собственную any
не так сложно Я не рекомендую изобретать велосипед, но в этом случае это не так сложно.
Вот SO вопрос с ответом, показывающим способ сделать «любой».
Незаконно вводить новые типы в std
через стороннюю библиотеку. Вы можете обновить свой компилятор, получить отдельную стандартную библиотеку, которую поддерживает ваш компилятор, или использовать стороннюю библиотеку, которая предоставляет any
в другом пространстве имен или напишите свое собственное.
Первое, что вы сказали нет.
Второе сложно, так как xcode не афиширует, каким на самом деле является его компилятор. Обычно есть две общие библиотеки std, которые работают с компиляторами, производными от clang-llvm; libc ++ и libstdc ++. Такой тип обмена, как правило, очень дорогой, даже если у другого есть нужная вам функция.
Третий в основном «использовать boost
» или эквивалент.
Последнее не сложно; работа в течение нескольких дней (в основном ошибки после факта), основанная на написании типов схожей сложности, при условии, что «достаточно хороший» достаточно хорош (т. е. не увяз в идеальных гарантиях исключений или не соответствует точно стандарту и т. д.) Реализация потребует гиперболических усилий, чтобы приблизиться к совершенству, естественно.
Бета-версия Xcode 9.0 теперь может быть загружена (https://developer.apple.com/download/). Он поддерживает параметр флага c ++ 17.
Редактировать: Xcode 9.2 публично доступен с поддержкой std :: any.