c++ - 非静态成员变量创建类似于 C++ 中的静态单例创建

标签 c++ templates static non-static class-members

首先,我真的很喜欢单例的延迟初始化模式。我通过以下方式使用它来获取具有不同值类型的不同类型的数据(示例已简化):

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 的指针并具有单独的插入接口(interface)。

用法:

ThingGetter mythings;

mythings.get<bool>() = true;
mythings.get<double>() = 1.5;
return mythings.get<int>();

关于c++ - 非静态成员变量创建类似于 C++ 中的静态单例创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29592275/

相关文章:

C++检测类型是否为字符串对象

Javascript 模板渲染器

c++ - 可变参数模板求和类

c++ - std::可选 - 使用 {} 或 std::nullopt 构造空?

c++ - 实现一个可以存储其函数参数的仿函数模板

java - 如何防止数组的值改变

c++ - 与参数同名的方法导致不同的输出

java - 总是需要做静态

c++ - QT中如何自定义 "Notification Web API"

c++ - SIGSEGV 在 C++ 循环中有一个非常大的数组