Проблема: проект конпелируется в лучших традициях по 15 минут в 8 потоков. Изи солюшн: перестать писать код в хидерах и начать инстанциировать в cpp — это все и собаке понятно.
Но вот при попытке сделать так натыкаюсь на грабли: объекты соержат данные, объявления которых приводят к жуткой шаблонной оргии. Хочется а) сохранить статичный интерфейс (никаких virtual = 0); б) не связываться с pimpl, ибо уродство.
В любимой сишечке все делается просто и элегантно:
#ifndef LIBRARY_SOURCE
typedef void *INTERFACE;
#endif
INTERFACE* interface_new(int param1, int param2);
void inferface_free(INTERFACE *iface);
int interface_method1(INTERFACE *iface, int arg);
/* etc */
В C++ это смотрится вроде как убого, потому что можно вызывать статические методы через точку или стрелочку, но объявить такой объект в хидере нельзя.
pimpl убого по определению и даже не рассматривается, абстрактный базовый класс связывает по рукам и ногам и вообще заставляет писать лишний и ненужный код. Плюнуть на крестоахинею и писать как диды завещали (бонусом сделать все extern C и наслаждаться изи биндингами ко всему, что движется), или есть что-то чего я не знаю?
P. S. самое близкое, но убогое — это
// header
struct Interface {
protected:
public:
Interface() = delete;
Interface(const Interface&) = delete;
~Interface();
int method1(int arg1, int arg2);
static Interface *create(int param1, int param2);
}
// cpp
struct Implementation : public Interface {
CTemplate<is<shit>,and<urine>> field;
/* пихаем всю дейту */
Implementation(int param1, int param2) { ... }
int method1(int arg1, int arg2) { ... }
};
Interface* Interface::create(int param1, int param2) {
return new Implementation(param1, param2);
}
/* извращенный pimpl, можно было бы напрямую работать с this, интерпретируя его как Implementation */
int Interface::method1(int arg1, int arg2)
{
return reinterpret_cast<Implementation*>(this)->method1(arg1, arg2);
}
/* вишенка на торте: бесконечная рекурсия, как я люблю, х-з че делать */
Interface::~Interface()
{
reinterpret_cast<Implementation*>(this)::~Implementation();
}
Че делать-то?
Перемещено leave из desktop