非静态成员变量创建,如C++中的静态单例创建
Non-Static member variables creation like static singleton creation in C++
首先,我真的很喜欢单例的延迟初始化模式。我通过以下方式使用它来获取具有不同值类型的不同类型的数据(该示例已简化):
class A
{
template<typename T>
const T& getData() const
{
static T data;
return data;
}
}
我知道 data
变量没有连接到类的任何实例,并且它一直存在到程序结束。
但是我现在想要的是,类 A 的每个实例都应该以非静态的方式保存变量,并且仍然应该有调用.getData<bool>()
或任何其他数据类型的灵活性,而无需在类定义中指定每个可能的数据类型。
这可能吗?我还没有想出实施它的想法。
我想到了一个带有容器的东西,例如:
template<A*, typename T>
class DataContainer
{
T data;
}
有了它,可以将代码扩展到:
class A
{
template<typename T>
const T& getData() const
{
static DataContainer<this, T> container;
return container.data;
}
}
但这不能编译。
你们中有人知道如何实现它吗?
这里有
一个想法,使用Boost.any:
#include <typeinfo>
#include <type_index>
#include <unordered_map>
#include <boost/any.hpp>
struct ThingGetter
{
template <typename T>
T & get()
{
auto key = std::type_index(typeid(T));
auto it = things.find(key);
if (it == things.end())
{
it = things.emplace(key, boost::any(T())).first;
}
return boost::any_cast<T&>(*it);
}
std::unordered_map<std::type_index, boost::any> things;
};
此简单版本假定每个类型都可以进行值初始化,如果不存在所请求类型的条目,则创建一个值初始化值。替代实现可以返回一个指针,该指针可能为 null 并具有单独的插入接口。
用法:
ThingGetter mythings;
mythings.get<bool>() = true;
mythings.get<double>() = 1.5;
return mythings.get<int>();
相关文章:
- 如何使用类型级函数动态创建静态类型?
- QBS 为静态链路 MSVC 创建静态库
- 如何使用 GCC 编译器优化创建静态库?
- 创建静态哨兵节点的正确方法是什么
- 从现有项目(VS)创建静态库
- 从Excel/CSV值创建静态数组
- 在Xcode中创建静态库时,找不到libstdc .6.dylib
- 创建静态数据成员的代码有什么问题
- C 在不构造它的情况下创建静态对象(无需分配)
- C - 函数能够访问类方法,而不会创建静态或对象
- 使用新的位置来创建静态常量指针,指向静态内存缓冲区
- 编译libgdiplus源以创建静态链接的库,即libgdiplus.so
- 在C++中创建静态库(.a)(不适用于iOS)
- 需要帮助使用 make 创建静态 C++ 库
- g++正在创建静态库:无法读取符号.存档没有索引
- 如何为程序创建静态库
- C Gnu makefile我无法用ar创建静态库
- 竞争条件:一个线程创建静态对象,另一个线程在初始化完成之前使用它.如何处理
- 同时创建静态和动态库
- 如何使用系统库创建静态库