类型比std :: reference_wrapper更好地模拟C ++引用

时间:2015-12-12 03:11:46

标签: c++ c++11 reference stl reference-wrapper

我正在设计一个类似C ++引用的类,但会做一些额外的工具(簿记)。

最初我认为std::reference_wrapper<T>将是一个很好的模型。但过了一段时间后,我意识到std::reference_wrapper<T>作为C ++引用,即使在原则上也不行,因为赋值会重新绑定内部指针。

    double a = 5.;
    double b = 3.;
    double& ref = a;
    ref = b;
    assert(&ref != &b); // ref is not bound to b
    std::reference_wrapper<double> refwpr = a;
    refwpr = b;
    assert(&refwpr.get() == &b); // ref wrapper was rebound to b

我当然可以改变我自己的类的行为(不是重新绑定),但我可能已经在那里模拟引用的类了。例如“std::real_reference<T>”之类的内容。

是否有更严格模仿参考的类(标准与否)

我认为它也很有用,例如在人们看到的许多地方 std::vector<std::reference_wrapper<T>>作为std::vector<T&>的替代方案而提出,但这是误导性的,因为语义不同,但可以通过一些修改来实现std::vector<std::real_reference<T>>

我现在认为如果一个“完美”的引用包装器是可能的,那么引用可能只是用指针实现而我们不需要T& 但只是简单地拥有一个库功能reference<T>,其功能与T&完全相同......

...这反过来意味着该语言可以允许您在类型上“重载”&属性以生成自定义类型而不是语言引用。例如using mytype& = custom_reference_emulator_of_mytype

1 个答案:

答案 0 :(得分:2)

template <typename T>
class Tref {
    std::tuple<T &> t;
public:
    template <typename... Args>
    Tref(Args&&... args): t(std::forward<Args>(args)...) {}
    operator T &() { return std::get<0>(t); }
    decltype(&std::get<0>(t)) operator&() { return &std::get<0>(t); }
};


Tref<double &> t(a);
t = b;
assert(&t != &b);

当模板擦除引用时,std::reference_wrapper的作用是什么。您无需构建满足您需求的课程,只需使用常规参考。 (我可能没有说清楚。我的英语很差。)