通用容器用法,无副本。完美的转发?

时间:2019-04-03 23:46:16

标签: c++ c++17

我有以下容器:

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中执行多个副本,但是我找不到找到使之起作用的方法。也许有一种使用完美转发或移动语义的方法吗?

0 个答案:

没有答案