繁体   English   中英

如何使用 C++ 模板模拟类型的引用?

[英]How to simulate reference of a type with C++ templates?

我想用 class 包装一个类型的引用,以向它添加其他功能,如下所示,但我不想强制使用 function 或运算符来访问基本类型方法。

class A {
    private:
        int fX;
    public:
        void SetSomething(int x){ fX = x; }
        int GetSomething() { return fX; }
};

template<typename T>
class Ref {
    private:
        T& fRef;
    public:
        Ref(T &ref) : fRef(ref) {}
        inline operator T&() { return fRef; }
};

int main() {
    A a;
    Ref<A> ref(a);
    ref.SetSomething(100);
    return 0;
};

https://godbolt.org/z/8x8aehb8e

有可能实现这种模板吗?

不幸的是,透明代理目前在 C++ 中是不可能的。 您可以从类型继承,实现operator->或重新创建整个接口。 我通常在引用类型中重写整个接口。

你可以使用std::reference_wrapper

cppreference 上的 std::reference_wrapper

std::reference_wrapper 是一个 class 模板,它将引用包装在可复制、可分配的 object 中。 它经常被用作将引用存储在通常不能保存引用的标准容器(如 std::vector)中的一种机制。

他们的例子:

    std::list<int> l(10);
    std::iota(l.begin(), l.end(), -4);
    std::vector<std::reference_wrapper<int>> v(l.begin(), l.end());
    // Then you can simulate random access on a list :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM