将延迟加载编写为模板类是否合理?

Is it reasonable to codify lazy loading as a template class?

本文关键字:是否 延迟加载      更新时间:2023-10-16

我想知道是否有像

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分钟内把它扔在一起,所以....)

它叫做boost::optional。这应该提供了几乎所有必要的功能。