не уверен, что я понимаю вопрос, но несколько моментов:
1) Фабрики должны возвращать указатели на динамически размещенные объекты, если вы хотите использовать их с boost :: smart_ptr.Использование интеллектуальных указателей (которые будут пытаться удалять объекты, когда они выходят из области видимости, и никакой другой smart_ptr не владеет объектом) со статически размещенными переменными не имеет смысла.
2) Когда вы действительно возвращаете указатель (вашstruct code будет выглядеть примерно так)
struct C {
C() { ... };
static C* Factory(A a, B b) {
...;
return new C;
}
};
, тогда вы можете просто сделать
boost::shared_ptr<C> p_C(C::Factory(a,b));
, поэтому я не совсем уверен, будет ли эта (возможно, очень сложная) функция шаблона настолько полезной,(Для меня это использование фабричного шаблона также кажется странным - AFAIK вы обычно хотите абстрагироваться от точного типа создаваемого объекта, но это уже другой момент).
Редактировать: (Ответить на комментарий, так как вы можетене форматируйте комментарии ...)
Я почти уверен, что использование shared_ptr, который указывает на статически размещенные переменные, приведет к двойным ошибкам удаления (по крайней мере, если объекты-деструкторы удаляют что-либо) ... это, безусловно,опасный путь
Разве вы не можете просто сделать (скопировать из связанного вопроса)
shared_ptr<MyClass> CreateWithList(list lst)
{
return shared_ptr<MyClass>(new MyClass(lst)); // construct with a list here
}
shared_ptr<MyClass> CreateWithPyArrayObject(PyArrayObject* obj)
{
return shared_ptr<MyClass>(new MyClass(obj)); // construct with numpy array here
}
?Я имею в виду, я уверен, что реальный случай более сложен, чем этот, но сейчас он кажется проще, чем материал шаблона.
Кстати: если вы только после скорости C-типа в Python, введите Cython попытка, это действительно круто (даже если это не применимо сейчас, это может произойти в будущем ...)