2017-01-02 4 views
7

Я использую C++ 11, в то время как мне нужны некоторые классы из библиотеки C++ 17. Я хочу сделать следующее:Псевдоним пространства имен в C++

#if __cplusplus < CPP17 
using std::any = boost::any; 
#endif 

Такой псевдоним не допускается. Кроме того, расширение пространства имен std вызывает undefined behaviour. Я хочу, чтобы мой код выглядел одинаково в отношении версии C++. Есть ли четкий способ?

+5

Просто используйте свое имя и назначьте ему 'boost :: any' или' std :: any', если необходимо? –

ответ

6

Ясный способ добавить к нему индивидуальное имя.

#if __cplusplus < CPP17 
using my_any = boost::any; 
#else 
using my_any = std::any;  
#endif 

// using my_any... 
+0

Я использую std :: any для совместимости с C++ 17. – Ariel

+1

@Ariel Как вы поняли, невозможно «модифицировать» пространство имен std на законных основаниях. – songyuanyao

6

Похоже, что вы пытаетесь создать псевдоним типа в пространстве имен. Corect синтаксиса для этого является:

namespace namespace_name { 
    using any = boost::any; 
} 

Однако стандарт Запрещает добавление определения (есть исключения для шаблона специализации) в std пространства имен, так что если вы пытались определить std::any, поведение вашей программы будет неопределенным.

Использование любого пространства имен, включая глобальное, является ОК, но не зарезервировано для реализации, которое включает в себя std и его пространства имен.

+0

Я попытался добавить определения в пространстве имен std и был скомпилирован. – Ariel

+3

@Ariel Я внесла поправки в свой ответ. Определения в 'std' не делают программу плохо сформированной, она делает поведение неопределенным. Тем не менее, недобросовестность не гарантирует, что программа не будет компилировать. – user2079303

+0

Очень грустно, что, когда я переключаюсь с старой версии C++ на новую, мне нужно изменить все «boost» в «std». – Ariel

0

Я не вижу больших проблем с неопределенными поведением. Вы используете #if для проверки на C++ 17, и вы знаете, что до этого нет any. Если вы действительно этого хотите, я говорю об этом, и поместите псевдоним в std, если он раньше C++ 17.

В конце дня вспомогательные функции/classes/etc, вероятно, будут помещены в другое пространство имен или с префиксом __, потому что это доступно для стандартных библиотек. Я не думаю, что реализация pre-C++ 17 экспорта any в std.

Нет другого пути. Просто игнорируйте «неопределенное поведение» и выполняйте его, если он работает. Нет ничего волшебного в том, что он разрушает ваш код; худшее, что может произойти, - это неудачная реализация std, и она не скомпилируется при определении псевдонима. На мой взгляд, некоторые люди преувеличивают неопределенные проблемы с поведением.

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