← All posts tagged боян

Drino
C++ programming говно длиннопсто Нашёл два относительно красивых костыля для решения проблемы из #1773614. Думаю они вообще говоря боянисты, но на изобретение их в качестве велосипедов пришлось изрыть полгугла (видимо не то искал, но бесполезно) и потратить полдня.
Объясню, зачем мне хотелось получить всякие стандартные операторы — есть у меня функция вида
template < class A, class B, class Func >
void joinMap ( map < A, B >* result, const map < A, B >& other, Func join);
И этот joinMap, например, берёт и применяет join ко всем ((*result)[it->first], it->second). Возвращаясь к проблеме — на получение operator-= придётся забить, ибо невозможно. Поэтому пишется темплейтная функция T& SubEq < T > (T&, const T&) и подобные ей (естественно они пихаются в личный неймспейс для костылей). Дальнейшее решение проблемы зависит от любви пользователя к извращениям.
Вариант 1 — пилим шаблонную функцию, которая принимает какой-либо шаблонный класс и другую шаблонную функцию, и возвращает эту функцию с уже использованным шаблоном. Нечто вроде
template < class T >
T& () ( T&, const T&) getEqOperator(vector < T >, T& () ( T&, const T&) oper) { return oper; }
Конечно не помешают темплейтные тайпдефы, дабы всё это выглядело получше (а они сами по себе уже большой костыль, который реализуется через struct).
Минусы — надо напилить по функции на каждую сигнатуру. С другой стороны альтернатива мне кажется несколько более кривой.
Вариант 2 — уточняем тип параметра-функции для нашего абстрактного joinMap.
template < class A, class B >
void joinMap ( map < A, B >* result, const map < A, B >& other, B& (*join) (B&, const B&));
Работает, но ровно до тех пор, пока нам не вздумается послать в качестве join что-нибудь, не влияющее на суть, но отличное от шаблона. И к величайшему несчастью
template < class A, class B, class C >
void joinMap ( map < A, B >* result, const map < A, B >& other, C (*join) (B&, const B&));
ппочему-то мешает g++ нормально определить типы.