C ++, переменная шаблона в не шаблонном классе - PullRequest
4 голосов
/ 21 декабря 2010

Я использую следующие классы шаблонов:

template <class T>
class Point2D
{
    private:
            T x;
            T y;
...
};

template <class T>
class Point2D;

template <class T>
class Line{
    private:
          Point2D <T> *start;  
          Point2D <T> *start; 
    .... 
};

Если я хочу создать линию объекта, необходимо указать тип точки и тип линии

int main
{
     Point2DC<double> p1(0,0);
     Point2DC<double> p2(10,10);
     Line<double> l(&p1,&p2);
     ...
}

Я нахожу это довольно бессмысленным ... Если точки двойные, значит, Линия также должна быть двойной ... Можно ли шаблонизировать только указатели в классе Line и не шаблонизировать весь класс, что-то в этом роде

template <class T>
class Point2D;

class Line{
    private:
          template <class T>
          Point2D <T> *start;  
          Point2D <T> *start; 
    .... 
};

и используйте

int main
{
     Point2D<double> p1(0,0);
     Point2D<double> p2(10,10);
     Line l(&p1,&p2);
     ...
}

1 Ответ

6 голосов
/ 21 декабря 2010

Не напрямую.Вы можете создать функцию make_line вдоль строк std::make_pair, которая неявно вычисляет тип возвращаемого значения на основе типов ввода, но ее тип возвращаемого значения все равно будет Line<double>.Это полезно, если вы создаете анонимный Line для передачи в другую функцию.

В C ++ 0X есть новое использование ключевого слова auto для объявления неявно типизированной переменной, основанной натип назначенного выражения.

Так что это позволит сделать что-то вроде этого (без изменения классов Point2D или Line):

template <class T>
Line<T> make_line(Point2D<T> *p1, Point2D<T> *p2)
{
    return Line<T> (p1, p2);
}

template <class T>
void DoSomethingWithALine(const Line<T> &l)
{
     ....
}

int main
{
     Point2DC<double> p1(0,0);
     Point2DC<double> p2(10,10);
     // C++0X only:
     auto l = make_line(&p1,&p2);

     // Current C++:
     DoSomethingWithALine(make_line(&p1, &p2));
     ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...