Получаете тип для создания шаблона? - PullRequest
1 голос
/ 22 мая 2010

У меня следующая ситуация:

У меня есть объект типа MyClass, у которого есть метод для приведения себя к базовому классу. Класс включает в себя typedef для своего базового класса и метод для выполнения upcast.

template <class T, class B>
class BaseClass;

template <class T>
class NoAccess;

template <class T>
class MyClass : public BaseClass<T, NoAccess<T> >
{
  private:
    typedef BaseClass<T, NoAccess<T> > base;

  public:
    base &to_base();
};

Мне нужно передать результат вызова base функтору Operator:

template <class Y>
class Operator
{
   Operator(Y &x);
};

Operator<???> op(myobject.to_base());

Есть ли простой способ заполнить ??? при условии, что я не хочу использовать NoAccess?

Ответы [ 3 ]

3 голосов
/ 22 мая 2010

Вы можете определить заводскую функцию для использования вывода типа:

template< class Y >
Operator<Y> create_operator( Y &y ) {
    return Operator<Y>( y );
}
3 голосов
/ 22 мая 2010

Я вижу три возможности:

  1. make MyClass<T,B>::base a public идентификатор

  2. измените ваш оператор и сделайте конструктор шаблоном, используя стирание типа (может быть сложно):
    class Operator { template<class Y> Operator(Y &x); }

  3. переместить код, создающий объект Operator, в собственный шаблон функции:
    template<typename T> Operator<T> createOperator(const T& base)
    {return Operator<T>(base);}

2 голосов
/ 22 мая 2010

Вы можете сделать typedef общедоступным:

Operator<MyClass<type>::base> op(myobject.to_base());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...