Есть ли C++ ленивый указатель?

Вы можете попробовать что-то вроде этого:

try:
    reaction, user = await bot.wait_for('reaction_add', timeout=30.0)
except asyncio.TimeoutError:
    await user.send('I did not receive your reaction :(')
else:
    if str(reaction.emoji) == '         
14
задан Ajay 21 October 2014 в 07:13
поделиться

4 ответа

Свернуть собственное очень мало.

template<typename T>
class lazy {
public:
    lazy() : child(0) {}
    ~lazy() { delete child; }
    T &operator*() {
        if (!child) child = new T;
        return *child;
    }
    // might dereference NULL pointer if unset...
    // but if this is const, what else can be done?
    const T &operator*() const { return *child; }
    T *operator->() { return &**this; }
    const T *operator->() const { return &**this; }
private:
    T *child;
};

// ...

cout << boxes[49]->width;
18
ответ дан 1 December 2019 в 09:02
поделиться

Используя boost :: optional , вы можете получить такую ​​вещь:

// 100 lazy BigStuffs
std::vector< boost::optional<BigStuff> > v(100);
v[49] = some_big_stuff;

Построит 100 ленивых и назначит один реальный some_big_stuff для ] v [49] . boost :: optional не будет использовать память кучи, но будет использовать новое размещение для создания объектов в буфере, выделенном стеком. Я бы создал оболочку вокруг boost :: optional следующим образом:

template<typename T>
struct LazyPtr {
    T& operator*() { if(!opt) opt = T(); return *opt; }
    T const& operator*() const { return *opt; }

    T* operator->() { if(!opt) opt = T(); return &*opt; }
    T const* operator->() const { return &*opt; }    
private:
    boost::optional<T> opt;
};

Теперь здесь используется boost :: optional для выполнения различных операций. Он должен поддерживать конструкцию на месте, подобную этой (пример на op * ):

T& operator*() { if(!opt) opt = boost::in_place(); return *opt; }

Что не потребует никакого копирования. Однако текущее руководство по ускорению не включает эту перегрузку оператора присваивания. Однако источник знает. Я не уверен, является ли это просто дефектом в руководстве или его документация намеренно исключена. Поэтому я бы использовал более безопасный способ, используя присваивание копии, используя T () .

10
ответ дан 1 December 2019 в 09:02
поделиться

Я никогда не слышал о таком, но, опять же, есть много вещей, о которых я никогда не слышал. Как «ленивый указатель» помещает полезные данные в экземпляры базового класса?

Вы уверены, что разреженная матрица - это не то, что вы действительно ищете?

2
ответ дан 1 December 2019 в 09:02
поделиться

Насколько мне известно, не существует реализации такого рода вещей. Однако создать его будет несложно.

0
ответ дан 1 December 2019 в 09:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: