Использование шаблонной структуры в качестве аргумента конструктора - PullRequest
0 голосов
/ 16 января 2020

У меня есть шаблон класса Point, в котором будут храниться координаты x и y, тип данных может быть любым арифметическим c тип.

template <typename T, typename U>
struct Point {
  T x;
  U y;
};

Класс Line принимает две точки в качестве аргумента конструктора, чтобы найти уравнение of line.

class Line {
public:
  Line(Point p1, Point p2) {}
};

Как мне спроектировать класс Line, чтобы он мог принимать объект Point разных типов данных?

Я разработал что-то вроде ниже, как я могу улучшить его?

template <class T, class U,
          class = typename std::enable_if<std::is_arithmetic<T>::value &&
                                          std::is_arithmetic<U>::value>::type>
struct Point
{
    T x;
    U y;
    typedef T x_type;
    typedef U y_type;
};

template <typename T1, 
          typename T2,
          typename P1 = typename T1::x_type,
          typename P2 = typename T1::y_type,
          typename P3 = typename T2::x_type,
          typename P4 = typename T2::y_type>
class Line {
public:
  Line(Point<P1, P2> p1, Point<P3, P4> p2) {}
};

Я планирую использовать:

Point<int, long> p1 (2, 5);
Point<short, double> p2 (77, 33.5);
Line<Point<int, long>, Point<short, double>> line_(p1, p2);

OR

Line<Point<int, short>, Point<float, unsigned>> eq({1, 1}, {2.3f, 2});

Как можно импровизировать или укоротить код.

Ответы [ 2 ]

3 голосов
/ 17 января 2020

Вам не нужно иметь столько параметров типа в Line.

template <typename Point> 
struct is_point : std::false_type {};

template <typename T, typename U>
struct is_point<Point<T, U>> : std::true_type {};

template <typename P1, typename P2>
class Line {
   static_assert(is_point<P1>::value && is_point<P2>::value, "Line needs Point template parameters")
   public:
   Line(P1 p1, P2 p2) {}
};
2 голосов
/ 16 января 2020

Шаблоны - это просто шаблоны, а не типы. У вас не может быть функции, которая принимает шаблон в качестве параметра, если вы не пишете шаблон функции, или в случае вашего Line шаблона класса, как у вас уже есть, но его можно написать немного проще:

template <typename T,typename U>
class Line {       
   public:
   Line(Point<T,U> p1,Point<T,U> p2) {}
};

Альтернативно параметризация Line для типа точек:

template <typename P>
class Line {       
   public:
   Line(P p1,P p2) {}
};

Как мне спроектировать класс Line, чтобы он мог принимать объект Point разных типов данных?

Обратите внимание, что шаблон Line принимает различные типы Point s, но один конкретный экземпляр, например, Line<int,int> будет принимать только Point<int,int>, и это тип совершенно другой и не имеет отношения, например, к Line<int,double>. Если вы хотите иметь один тип линий, который принимает разные точки, требуется больше. Это действительно зависит от того, чего вы на самом деле хотите достичь.

...