C ++ лямбда;заводской адаптер класса - PullRequest
2 голосов
/ 21 апреля 2011

Учитывая класс фабрики

struct C {
    C Factory(A a, B b, ...) { ... }
};

Я хочу преобразовать его в функцию, которая автоматически возвращает общий указатель. Что-то вроде:

template<T (*f)(Args...), typename T, typename... Args>
boost::shared_ptr<T> blah(Args... args) {
  return boost::shared_ptr<T>(new T(f(args...)));
}

, который я могу использовать как:

shared_ptr<C> c = blah<C::Factory>(a, b, ...);

Я использую gcc4.4, но при необходимости могу обновить до 4.5 для лямбд. Я делаю это потому, что после того, как я задал этот вопрос , мне теперь нужно преобразовать фабрики классов, чтобы они возвращали shared_ptr, но я не хочу менять определения классов - просто создайте адаптер.

1 Ответ

1 голос
/ 21 апреля 2011

не уверен, что я понимаю вопрос, но несколько моментов:

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 попытка, это действительно круто (даже если это не применимо сейчас, это может произойти в будущем ...)

...