我有一个有成员缓冲区的仿函数类。
由于语义,这个缓冲区是可变的是有意义的。
(例如,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。)
答案 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) {}
};