我有一个类,其中构造函数将参数作为引用。例如。

class A
{
    A(Tracer& t) : m_t(t) { }
  private:
     Tracer& m_t;
};

我将此class A作为boost::optional,只想在需要时构造它。如果我使用boost::in_place构造它。由于boost::in_place将参数用作const_refs,因此我不得不将构造函数的签名修改为
A(const Tracer& t) : m_t(const_cast<Tracer&>(t)  { }

还有其他通过引用传递对象的方法吗?

软体限制为Boost 1.4.3(VS2010)。

编辑:该类不可复制构造,也不可分配。我没有在上述示例类中证明这一点。

最佳答案

像这样:

#include <boost/optional.hpp>
#include <boost/ref.hpp>

struct Tracer
{
    Tracer() = default;

    Tracer(const Tracer&) = delete;
    Tracer(Tracer&&) = delete;
    Tracer& operator=(const Tracer&) = delete;
    Tracer& operator=(Tracer&&) = delete;
};

class A
{
public: // Note: I had to add this.
    A(Tracer& t) : m_t(t) { }
private:
     Tracer& m_t;
};

int main()
{
    Tracer tracer;
    boost::optional<A> x;

    x = boost::in_place(boost::ref(tracer));
}
boost::ref返回boost::reference_wrapper,该模型将引用建模为值。

10-04 12:33