Мой реальный пример довольно большой, поэтому я буду использовать упрощенный. Предположим, у меня есть тип данных для прямоугольника:
struct Rectangle {
int width;
int height;
int computeArea() {
return width * height;
}
}
И другой тип, который использует этот тип, например:
struct TwoRectangles {
Rectangle a;
Rectangle b;
int computeArea() {
// Ignore case where they overlap for the sake of argument!
return a.computeArea() + b.computeArea();
}
};
Теперь я не хочу устанавливать ограничения на владельца для пользователей TwoRectangles
, поэтому я хотел бы сделать его шаблоном:
template<typename T>
struct TwoRectangles {
T a;
T b;
int computeArea() {
// Ignore case where they overlap for the sake of argument!
return a.computeArea() + b.computeArea();
}
};
Использование:
TwoRectangles<Rectangle> x;
TwoRectangles<Rectangle*> y;
TwoRectangles<std::shared_ptr<Rectangle>> z;
// etc...
Проблема заключается в том, что если вызывающий пользователь хочет использовать указатели, тело функции должно быть другим:
template<typename T>
struct TwoRectangles {
T a;
T b;
int computeArea() {
assert(a && b);
return a->computeArea() + b->computeArea();
}
};
Каков наилучший способ объединить мою templated функцию, чтобы сумма максимального количества повторялась для указателей, значений и умных указателей?