我有以下容器:
constexpr auto id = [](const auto v) {return v;};
template <typename Op, typename Preop=decltype(id)>
class Cont{
public:
constexpr Cont(const Op & op_,const Preop & preop_=id):op(op_),preop(preop_){}
constexpr Cont(const Cont & cont_):op(cont_.op),preop(cont_.preop){}
const Op op ;
const Preop preop ;
template <typename Op2, typename Preop2>
constexpr auto operator()(const Cont<Op2,Preop2> & mfop) const{
return Cont<const Cont<Op,Preop>,const Cont<Op2,Preop2>>
(Cont(op,preop),mfop);}
constexpr auto operator()(const auto & v) const{return op*(preop*v);}
};
我使用它来使数组和函子兼容,从而使得在operator*
的某些正确定义下,以下main()
是有效的:
int main(){
const std::array<double,4> v{};
const Cont A(Oper<4,1>(1.));
const Cont B(std::array<std::array<double,4>,4>{std::array<double,4>{}});
constexpr auto res = B*B*A*A*B*A*B*v;
return 0;
}
如果需要,代码需要在编译时工作。我想避免在Cont
中执行多个副本,但是我找不到找到使之起作用的方法。也许有一种使用完美转发或移动语义的方法吗?