c++ - 转换 unique_ptr 的类型安全吗?

标签 c++ casting unique-ptr

template <class T> class Foo {};

class Manager {
    std::unordered_map<size_t, std::unique_ptr<std::vector<void *>>> _mFoos;

public:
    template <class T> void addFoo(Foo<T> &foo) {
        int x = typeid(T).hash_code();

        // Safe ? :
        auto &p = *(reinterpret_cast<std::unique_ptr<std::vector<Foo<T>>> *>(&_mFoos[x]));

        if (p == nullptr) {
            p.reset(new std::vector<Foo<T>>);
        }

        auto &foos = *p;
        foos.push_back(foo);
    };

    template <class T> Foo<T> &getFoo(int index) {
        int x = typeid(T).hash_code();
        auto it = _mFoos.find(x);

        auto &foos = *(reinterpret_cast<std::vector<Foo<T>> *>(it->second.get()));

        return foos[index];
    };
};

如果 T 和 T2 是两种不同的类型,则在 unique_ptr 中重新解释转换 unique_ptr 是否安全且可移植?它们是否具有相同的大小和相同的位模式?

最佳答案

没有。

根据严格的别名规则,不相关类型之间的转换(不同的模板实例是不相关的类型)是未定义的行为。

关于c++ - 转换 unique_ptr 的类型安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31320351/

相关文章:

c++ - random_shuffle 线程安全吗?如果不是,则使用 rand_r

从 char 数组中转换一个 short

c++ - 哪个更好 : A unique_ptr to a 2D array or a 2D array of unique_ptrs?

c++ - Shared_ptr 和 unique_ptr 有异常(exception)

c++ - 如何从 C++ 中的 tm 对象获取星期几?

c++ - curl 连接选项

c++ - 在库 API 中传递 std::string

c# - 字符串数字的 Float.parse 导致数据库中的另一个数字

c - 将 printf 移动到不同的行会产生不同的输出? (C)

c++ - 为什么 std::make_unique 调用复制构造函数