Вы можете попробовать что-то вроде этого:
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) == '
Свернуть собственное очень мало.
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;
Используя 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 ()
.
Я никогда не слышал о таком, но, опять же, есть много вещей, о которых я никогда не слышал. Как «ленивый указатель» помещает полезные данные в экземпляры базового класса?
Вы уверены, что разреженная матрица - это не то, что вы действительно ищете?
Насколько мне известно, не существует реализации такого рода вещей. Однако создать его будет несложно.