В C++ можно переименовать / псевдоним не пространство имен, имя не класса?

Я имею

namespace src {
   struct src_bar;
   void src_baz();
   template<class T> class src_qux;
}

который я хотел бы сослаться на

namespace dst {
    struct dst_bar;
    void dst_baz();
    template<class T> class dst_qux;
}

Это означает, что я хотел бы "переименовать" или "псевдоним" или "относить" имена из src,

За dst_bar можно конечно использовать namespace dst { typedef src_bar dst_bar; }, Есть ли какой-нибудь (не макро) эквивалент, позволяющий мне переименовать src::src_baz как dst::dst_baz а также src::src_qux как dst::dst_qux?

Если я не ошибаюсь, ни using оператор или псевдоним пространства имен не могут выполнить два других. Написание шаблонных функций пересылки для dst_baz() это возможно, но требует знания ар src_baz, Шаблон typedefs может иметь dst_qux<T>::type быть src_qux<T> но косвенность добавляет многословие.

FWIW, мой вариант использования принимает имена C, как somepackage_someportion_somefuncA и предоставление пространства имен дружественной версии somepackage::someportion::somefuncA так что другие люди могут использовать using somepackage::someportion для краткости.

3 ответа

Решение

Для функций вам придется вручную пересылать запросы. Для не шаблонных типов вы можете просто ввести typedef. Для типов шаблонов вы можете использовать новый using особенность C++11 Создать псевдоним в стиле typedef для шаблона, если ваш компилятор поддерживает его, или же вам в основном не повезло.

Нет, вы не можете "переименовать" что-то, чтобы оно больше не использовало свое первоначальное имя.

Тем не менее, вы можете получить тот же эффект с помощью обмана.

Во-первых, импортируйте заголовок для определений, которые вы хотите использовать в блоке пространства имен:

namespace foo {
    #include "src_stuff.h"
}

Теперь у вас есть foo::src::src_bar и друзья.

Затем используйте typedef обильно:

namespace bar {
    typedef foo::src::src_bar dst_bar;
}

Вуаля, у вас есть bar::dst_bar который так же, как src::src_bar был бы. Если вам не нужны определения, оставшиеся доступными под старыми именами, пропустите первый шаг и просто сделайте typedefдля удобства. Это то, для чего они, в конце концов.

Если использование макросов является приемлемым вариантом для вас, вот одно из решений:

// declare this macro in some common file
#define CREATE(SCOPE) \
namespace SCOPE { \
   struct SCOPE## _bar; \
   void SCOPE## _baz(); \
   template<class T> class SCOPE## _qux; \
}

Использование:

CREATE(src);
CREATE(dst);
Другие вопросы по тегам