В C ++ можно переименовать / псевдоним не пространство имен, имя не класса? - PullRequest
3 голосов
/ 01 февраля 2012

у меня

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 ]

2 голосов
/ 01 февраля 2012

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

0 голосов
/ 01 февраля 2012

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

// 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);
0 голосов
/ 01 февраля 2012

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

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

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

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 s для удобства. В конце концов, для этого они и нужны.

...