Разумно ли кодировать ленивую загрузку как шаблонный класс? - PullRequest
2 голосов
/ 22 июля 2011

Мне интересно, возможно ли что-то вроде

template <typename T>
class LazyLoaded
{
    mutable char mem[sizeof T]; //First item in the class to keep alignment issues at bay
    const std::function<void (T&)> initializer;
    mutable bool loaded;
public:
    LazyLoaded() : loaded(false)
    {
        initializer = [] (T&) {};
    }
    LazyLoaded(const std::function<void (T&)>& init) : initializer(init), loaded(false)
    {
    }
    T& Get()
    {
        if (!loaded)
        {
            new (static_cast<void *>(&mem)) T();
            initializer(*static_cast<T*>(&mem));
            loaded = true;
        }
        return *static_cast<T*>(&mem);
    }
    ~LazyLoaded()
    {
        if (loaded)
        {
            static_cast<T*>(&mem)->~T();
        }
    }
};

или имеет ли смысл это делать.(Я думаю, что есть проблемы с этим кодом, но эй, я бросил его вместе за 10 минут, так что ....)

1 Ответ

6 голосов
/ 22 июля 2011

Это называется boost::optional.Это должно обеспечить почти все необходимые функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...