Как использовать тип члена класса шаблона без указания ненужных параметров шаблона? - PullRequest
1 голос
/ 18 июня 2019

Я пытаюсь использовать тип члена класса шаблона, который не зависит от каких-либо параметров шаблона класса шаблона. Я хотел бы сохранить тип как тип члена из-за его логики, но я не хочу указывать ненужные параметры шаблона класса всякий раз, когда я хочу использовать тип члена вне класса.

Обратите внимание на следующее:

class Dummy { };

// Template class
template<typename T>
class A {
  public:

    template<typename T2>
    class MemberType : public T2 {
      public:
        T2 t2;
    };

};

int main()
{
  typename A<Dummy>::template MemberType<Dummy> m1; // okay
  typename A::template MemberType<Dummy> m2;        // not okay!

  return 0;
}

При попытке компилировать с использованием g ++ я получил следующую ошибку компилятора:

error: ‘template<class T> class A’ used without template parameters
   typename A::template MemberType<Dummy> m2; // not okay!

Есть ли обходной путь для этого?

Ответы [ 4 ]

1 голос
/ 18 июня 2019

Все в шаблоне зависит от параметра (ов), то есть может даже не иметь class MemberType.

Но вы можетесделать параметр по умолчанию - вам все равно нужно написать <> хотя (но вы можете опустить template обычно - даже typename, но я оставил это):

class Dummy { };

// Template class
template <class T = void>
class A {
  public:

    template<typename T2>
    class MemberType : public T2 {
      public:
        T2 t2;
    };

};

int main()
{
  typename A<Dummy>::MemberType<Dummy> m1; // okay
  typename A<>::MemberType<Dummy> m2;        // also ok

  return 0;
}

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

1 голос
/ 18 июня 2019

Я пытаюсь использовать тип члена класса шаблона, который не зависит от каких-либо параметров шаблона класса шаблона.

Как вложенный тип в class A<T>,MemberType зависит от параметра шаблона T.

, т.е. A<T>::MemberType<T2> и A<U>::MemberType<T2> являются различными классами.

0 голосов
/ 18 июня 2019

Есть ли обходной путь для этого?

MemberType является типом, зависящим от параметра шаблона, поэтому обязательно необходимо передать через содержащийся шаблон шаблонный параметр, чтобы определить его

typename A<SomeType>::template MemberType<AnotherType> m2;

Учитывая, что вас не интересует внешний параметр SomeType, лучший обходной путь, который я могу себе представить, это использование using следующим образом (или что-то подобное)

template <typename T>
using MemberType_t = typename A<T>::template MemberType<T>;

для уменьшения набора текста.

Ниже приведен упрощенный пример полной компиляции

#include <type_traits>

class Dummy { };

template <typename>
struct A
 {
   template <typename T2>
   struct MemberType : public T2
    { T2 t2; };
 };

template <typename T>
using MemberType_t = typename A<T>::template MemberType<T>;

int main ()
 {
   typename A<Dummy>::template MemberType<Dummy> m1;

   MemberType_t<Dummy> m2; // compile

   static_assert( std::is_same<decltype(m1), decltype(m2)>::value, "!" );
 }
0 голосов
/ 18 июня 2019

То, что вы хотите сделать, невозможно.Шаблон это просто шаблон.Вы можете сделать с ним очень мало, прежде чем создавать его для конкретного типа.Может быть специализация для A, у которой вообще нет вложенного MemberType.

Я хотел бы сохранить тип в качестве типа элемента из-за его логики, [...]

... но, похоже, логика это нечто другое: MemberType не зависит от A, следовательно, оно не должно быть частью шаблона, который зависит от A.

Неаккуратная речь template<typename T> можно читать как " все, что , которое следует, зависит от T".Даже если вы думаете, что это не так, всегда может быть специализация, которая что-то меняет внутри A.Если вы хотите, чтобы MemberType не зависел от T, объявите его вне A.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...