Здравствуйте, vdimas, Вы писали:
V>Зачем так, если можно так:
Интересно. Но думаю, может быть в следующей (0.5) версии это реализуем.
Тикет для этой идеи:
https://github.com/PetrPPetrov/beautiful-capi/issues/36
Здравствуйте, GhostCoders, Вы писали:
GC>Интересно. Но думаю, может быть в следующей (0.5) версии это реализуем.
Да, на один уровень косвенности получается меньше, если надо реализовывать семантику уникального или расшаренного владения.
Причем, при таком подходе у нас обязательно будет либо уникальное, либо расшаренное владение, бо с голым указателем работать страшно. ))
Т.е. дополнительно потребуется:
— Запретить публичные конструкторы, чтобы не создавать Printer по-значению, не копировать и не наследоваться от него.
— Снабдить каждый такой тип статической фабрикой:
class Printer {
public:
...
static Printer * create() {
return new Printer();
}
};
С другой стороны, есть такая идиома — AutoValue, допиливаем её до указателей:
template<typename T>
class AutoPtr : public unique_ptr<T> {
public:
AutoPtr() : unique_ptr<T>(T::create()) {}
};
typedef unique_ptr<Printer> PrinterPtr;
typedef AutoPtr<Printer> PrinterAutoPtr;
Еще можно в AutoPtr добавить некий template-template параметр SmartPtr=unique_ptr по-умолчанию, чтобы выбирать способ владения.
Здравствуйте, GhostCoders, Вы писали:
GC>То есть средство должно быть как можно легковесней, не быть очередным COM.
GC>У Swig есть С-генератор, но он вроде заброшен.
GC>Плюс Swig парсит C++\C заголовки, я же планирую облегчить себе жизнь,
GC>вводя описание API как внешние XML файлы в формализированном виде.
GC>Кто что думает?
Если это проект нацеленный на реальное использование,
то доработка swig по-моему почти единственный вариант.
Тем более не стоит забывать, что почти все "обертки" для использования
C/C++ из других языков которые генерирует swig, это на самом "C" API.
Например для использования C++ из Java для класса:
class Foo {
public:
void f();
};
swig сгенерирует что-то типа:
extern "C" void Java_com_package_Foo_f(JNIEnv *env, jobject thiz)
{
Foo *foo = convert(thiz);
foo->f();
}
тоже самое для Python, PHP и т.д., т.е. в каждом случае будет генерироваться
C API, сделать плюс один вариант по-моему намного легче чем реализовывать swig еще раз.