В 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);