Множественная отправка [пересечение формы]C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Множественная отправка [пересечение формы]

Сообщение Anonymous »

Я надеюсь, что этот вопрос не будет рассматриваться как основанный на мнении или что-то в этом роде. Хотя речь идет о пересечении фигур, описываемая проблема довольно общая (например, как создать шаблон функции, который не упорядочивает параметры шаблона и т. д.).
Это также вопрос домашнего задания. Меня об этом спрашивали около года назад, и тогда я не смог быстро решить эту проблему. Недавно эта задача вновь показала мне свое лицо. И я начал над этим работать.
Я пытался решить ее пару дней, но безуспешно, поэтому решил обратиться за помощью к гуру :)
Предположим, у меня есть разные типы фигур: Треугольник, Круг, Шестиугольник (но не ограничиваясь ими, пользователь может добавить свои собственные). Предположим, я хочу найти способ пересечь эти типы. Я предполагаю, что для каждой возможной пары (A, B) пользователь может определить свой алгоритм пересечения фигур в паре intersect(A,B). Но я хочу добиться следующего дизайна:
  • Пользователю разрешено определять либо intersect(B, A), либо intersect(A, B).
  • Если пользователь определил как intersect(A, B), так и intersect(B, A) - программа не компилируется.
  • Мне не нужна среда выполнения полиморфизм (без динамического_cast или любого другого RTTI). Я хотел бы решить эту проблему с помощью магии шаблонов.
  • Только для C++17
Мои попытки
Просто функция
Я думал о создании шаблона функции

Код: Выделить всё

template
intersect(const A&, const B&)
но с разными комбинациями, а затем создайте «проходную» цепочку (если одна не специализирована, перейдите к следующей):

Код: Выделить всё

(b, a) -> (a, b) -> (a, b) -> (a, b)
Примерно так:

Код: Выделить всё

template
void intersect(const A& a, const B& b)
{
static_assert(false, "No intersection algorithm found");
}

template
void intersect(const B& b, const A& a)
{
intersect(a, b);
}
Но это не работает по разным причинам.
Шаблон класса со статическим методом

Код: Выделить всё

template
struct Intersector
{
typedef void Fake;

static void intersect (const A&, const B&)
{
static_assert(false, "Default");
}
};

template
struct Intersector
{
typedef int Fake;
static void intersect(const Hexagon&, const Triangle&)
{
std::cout 
static void intersect(const A& a, const B& b)
{
Intersector::intersect(b, a);
}
};
И его использование следующее:

Код: Выделить всё

Hexagon h;
Triangle t;
I::intersect(h, t)
Но даже если мы проигнорируем некрасивый способ указания алгоритма, он тоже не сработает.
Итак, теперь я прошу помощи. Как бы вы это решили?

Подробнее здесь: https://stackoverflow.com/questions/798 ... ion-design
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»