C++ 将延迟加载编码为模板类是否合理?

C++ 将延迟加载编码为模板类是否合理?,c++,c++11,lazy-loading,C++,C++11,Lazy Loading,我想知道是不是 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

我想知道是不是

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();
        }
    }
};
模板
懒散类
{
mutable char mem[sizeof T];//类中阻止对齐问题的第一项
常量std::函数初始值设定项;
可变布尔加载;
公众:
LazyLoaded():已加载(false)
{
初始值设定项=[](T&){};
}
LazyLoaded(const std::function&init):初始值设定项(init),已加载(false)
{
}
T&Get()
{
如果(!已加载)
{
新的(静态_cast(&mem))T();
初始值设定项(*static_cast(&mem));
加载=真;
}
返回*static_cast(&mem);
}
~lazyload()
{
如果(已加载)
{
静态_cast(&mem)->~T();
}
}
};

是可能的或有意义的。(我认为这段代码有问题,但嘿,我在10分钟内就把它拼凑起来了,所以…)

它被称为。这应该提供几乎所有必要的功能。

为什么要乱放“新建”和“删除”?您可以使用普通的new,使用指针或智能指针删除和管理T实例。
std::aligned_storage
是更好的对齐解决方案。我认为
char[]
在这里并不完全正确。为什么数组和布尔值
是可变的?我看不到您在
const
成员函数中修改任何一个。@Praetorian:我认为
Get
应该是
const
@James:
alignas(t)
应该与
char[]
一起使用。在
aligned_存储
T
之间双关是非法的,不是吗?