可变参考成员类型

时间:2018-01-18 10:01:01

标签: c++11 reference mutable

我有一个有成员缓冲区的仿函数类。 由于语义,这个缓冲区是可变的是有意义的。 (例如,std::vector仅用于.reserve.capacity

struct F{
   mutable std::vector<double> buffer_;
   double operator(double const&) const{... reuse buffer_ ...;}
};

用作F f; for(double d = 0; ; ++d) f(d);

现在,如果由于某种原因我在构造F时有可用的缓冲区,我希望buffer_成为引用。 通用代码是

template<class Vector = std::vector<double>> // Vector can be also std::vector<double>&&
struct F{
   mutable Vector buffer_; 
   double operator(double const&) const{... reuse buffer_ ...;}
};

我可以将其用作F<std::vector<double>> f; for(...) f(d);

但是我不能让它成功

std::vector<double> existing buffer;
F<std::vector<double>&> f{existing_buffer}; 
for(...) f(d);

因为buffer_ cannot be declared as a ‘mutable’ reference

(该成员实际上是被禁止的mutable std::vector<double>& buffer_。)

当成员具有可变值但可以作为参考时,如何使代码通用?

我可以有F的两个特化(一个用于类型,一个用于参考),但我很好奇我是否可以单一定义。

template<class Vector = std::vector<double>>
struct F{
    mutable Vector buffer_;
    template<class... Args>
    double operator()(double const& d) const{...}
};

template<class Vector>
struct F<Vector&>{
    Vector& buffer_;
    template<class... Args>
    double operator()(double const& d) const{...}
};

(对于通用代码,我认为参考类型应该忽略mutable。)

1 个答案:

答案 0 :(得分:1)

也许是这些方面的东西?

struct F {
  mutable std::vector<double> local_buffer_;
  std::vector<double>& buffer_;

  F() : buffer_(local_buffer_) {}
  F(std::vector<double>& existing_buffer) : buffer_(existing_buffer) {}
};