首页 > 解决方案 > 键入允许通用分配的已擦除引用包装器,这可能吗?

问题描述

是否可以创建一个存储对任何类型变量的引用并允许泛型赋值(具有不同类型的值)的类?

想象一下这个界面:

class any_ref {
public:
    ...

    // construct any_ref from reference
    template <class T>
    any_ref(T &ref);

    // does stored_ref = std::forward<U>(value) internally
    template <class U>
    void assign(U&& value);
};

我被卡住了,无法弄清楚如何实现这一点。如果我们想象虚拟模板方法是可能的,那将很容易:

class any_ref {
public:
    ...

private:
    struct ref_holder {
        template <class U>
        virtual void assign(U&& value) = 0;
    };

    template <class T>
    struct ref_holder_concrete : public ref_holder {
        template <class U>
        void assign(U&& value) override {
            stored_ref = std::forward<U>(value);
        }

        T &stored_ref;
    };

    std::unique_ptr<ref_holder> ref;
};

所以我需要一些解决这种不可能的方法。问题是,赋值操作涉及两种类型。为了执行操作,我们需要以某种方式从其类型擦除的存储中检索其中一种类型。

标签: c++type-erasure

解决方案


推荐阅读