Как я могу упростить спецификатор вложенного имени в C ++? - PullRequest
1 голос
/ 20 ноября 2019

Предположим, у меня есть следующий код:

template<bool t>
class A{
  class B{
    class C{
      public:
        void foo();
    };
  };
};

template<bool t>
void A<t>::B::C::foo() {
// some code
}

при написании определения этой функции foo(), я хочу избежать написания слишком длинного вложенного спецификатора имени A<t>::B::C::, но использовать что-то вроде aShortAlias<t>::foo() вместо. Возможно ли это с C ++?

Видимо, использование using aShrtAlias<t> = typename A<t>::B::C не работает. И я действительно не хочу использовать #define в качестве обходного пути, поскольку он выполняет только замену текста (может быть, здесь есть какое-то оправдание для #define?).

Ответы [ 3 ]

1 голос
/ 20 ноября 2019

Хотя вы можете создать псевдоним:

template<bool T>
using X = typename A<T>::B::C;

Вы не можете использовать этот псевдоним в качестве спецификатора в объявлении:

template<bool T>
void X<T>::foo()   // not allowed; doesn't compile
{
   ...
}

Afaik, вам нужно использовать полное имя вдекларация.

1 голос
/ 20 ноября 2019

Просто используйте using:

template <bool T>
using aShortAlias = A<T>::B::C
0 голосов
/ 20 ноября 2019

Я думаю, что лучшее, что вы можете сделать, это:

template <bool T> using aShortAlias = typename A<T>::B::C;

template<> void aShortAlias<false>::foo() {
}
template<> void aShortAlias<true>::foo() {
}
...