Могу ли я использовать тип «this» в качестве аргумента шаблона (внутри макроса)? - PullRequest
3 голосов
/ 12 сентября 2011

У меня сейчас есть это:

#define THIS(T) (boost::static_pointer_cast<T>(shared_from_this()))

Макрос используется в таком методе:

void Derived::run() {
    do_something_with_a_shared_ptr(THIS(Derived));
}

Это все хорошо, но я бы хотел исключить (Derived) и иметь:

void Derived::run() {
    do_something_with_a_shared_ptr(THIS);
}

Возможно ли это?

В качестве альтернативы, есть ли лучший способ иметь удобный доступ к shared_ptr к this в классе, производном (косвенно) от boost::enable_shared_from_this? Этот вопрос , кажется, указывает на то, что ответ на этот вопрос - нет.

Иерархия классов выглядит следующим образом:

class Base: public boost::enable_shared_from_this<Base> {
    ...
}

class Derived: public Base {
    ...
    void run();
    ...
}

void do_something_with_a_shared_ptr(boost::shared_ptr<Derived>);

1 Ответ

3 голосов
/ 12 сентября 2011

Не совсем ответ на ваш вопрос, но вы рассматривали возможность использования функции-члена вместо макроса?Я обычно делаю что-то вроде:

boost::shared_ptr< Derived > shared_this()
{
     return boost::static_pointer_cast<Derived>(shared_from_this());
}
boost::shared_ptr< Derived const > shared_this() const
{
     return boost::static_pointer_cast<Derived const>(shared_from_this());
}
...