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
之间双关是非法的,不是吗?