Доступ к параметру шаблона из объекта класса - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть шаблон класса в myclass.hpp:

template<class T, class P>
class myclass
{
....
};

В моем main.cc я создаю объект класса:

myclass<int, double> mc;
otherfunc<myclass>(mc);

В каком-то другом заголовочном файле header1.hpp:

template<class MyClass>
void otherfunc(MyClass const &mc)
{
/* Access through 'mc' the underlying template parameters T and P*/
}

Как получить доступ к параметрам шаблона T и P в header1.hpp?

Ответы [ 3 ]

0 голосов
/ 17 сентября 2018

# 1

Один из способов - ввести typedef в myclass.

template<class T, class P>
class myclass
{
public:
    typedef T typeT;
    typedef P typeP;
};

и обращаться к ним как

template<class MyClass>
void otherfunc(MyClass const &mc)
{
    typename MyClass::typeT myMember;
}

# 2

Другой способ - использовать decltype.Скорее всего, вам не нужно буквально использовать параметры шаблона, но вы намерены использовать тот же тип, что и элемент, или возвращаемое значение элемента myclass.Итак, как то так:

template<class T, class P>
struct myclass
{
  T memberT;
  P memberP;
};

template<class MyClass>
void otherfunc(MyClass const &mc)
{
  using T = decltype(MyClass::memberT);
  using P = decltype(MyClass::memberP);
  T var1;
  P var2;
}
0 голосов
/ 17 сентября 2018

Как получить доступ к параметрам шаблона T и P в header1.hpp?

Укажите public определения типов в вашем классе myclass:

template<class T, class P>
class myclass
{
public:
     typedef T T_type;
     typedef P P_type;
....
};

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

typename myclass::T_Type x;
typename myclass::P_Type y;

в другом месте.

0 голосов
/ 17 сентября 2018

Пример:

template<class T, class P>
void otherfunc(myclass<T, P> const &mc)
{}

В качестве альтернативы:

template<class T, class P>
class myclass
{
    using ParamT = T;
    using ParamP = P;
};

template<class MyClass>
void otherfunc(MyClass const &mc)
{
    using ParamT = typename MyClass::ParamT;
    using ParamP = typename MyClass::ParamP;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...