一种体面的方式来转换const列表参考参数,然后传递到另一个函数



对不起,对于标题中没有精确解决问题,这就是事物。
假设我是一个适配器,我必须将功能重定向到另一个函数,
下面列出的:

我的主人会打电话给我的功能,并首先向我传达论点:

void receive (const list<Obj>& Larr){
    // do some transforming
    // Then call "send"
}

,然后我必须打电话给其他人,但是使用不同的容器参数:

void send (const vector<Obj*>& Varr){
    // ....
}

由于" const"的限制,显然,我不能仅仅执行" push_back"元素迭代的指针,例如:

void receive (const list<Obj>& Larr){
    for (list<Obj>::const_iterator it = Larr.begin(); it != Larr.end(); it++)
        // vec is my class member
        vec.push_back(&(*it));    // compile error: no match function
        // Because expected element is (Obj*) rather than (const Obj*)            
}

所以我想到的唯一方法是复制larr中的每个元素,然后将其在向量中的地址推送,我将要广播:

void receive (const list<Obj>& Larr){
    vector<Obj> tmp(Larr.size());
    int i = 0;
    for (list<Obj>::const_iterator it = Larr.begin(); it != Larr.end(); it++, i++){
        tmp[i] = *it;
    }
    for (i = 0; i < tmp.size(); i++)
        vec.push_back(&tmp[i]);
    // Call send here;
    send(vec);  // The lifecyle of tmp is ensured, no need to worry about
}

现在,在这种情况下,我的问题是不允许更改接口,有什么办法可以实现此目标而无需复制函数中的每个元素?

您对const的约束是正确的,根据定义,它无法修改。您唯一的选择是将列表转换为向量或将发送方法超载以支持列表类型。

您可以使用基于范围的构造函数来简化矢量构造,即

std::vector<Obj> tmp{ Larr.begin(), Larr.end() };

相关内容

最新更新