我经常遇到需要从数据源创建选择,操纵选择并将更改反馈回原始数据源的情况。就像是

#include <vector>

void manipulate(std::vector<int> &vector) {
    // Manipulate vector...
}

int main() {
    // Data source
    std::vector<int> dataSource{1, 2, 3, 4};

    // Select every second entry
    std::vector<int> selection{v[0], v[2]};

    // Manipulate selection
    manipulate(selection);

    // Feed data back to the data source
    dataSource[0] = selection[0];
    dataSource[2] = selection[1];

    return 0;
}


为了使将数据反馈回数据源的过程自动化,我可以将选择更改为指针或引用的向量(使用std::reference_wrapper),然后将其传递给操纵其参数的函数。或者,我可以创建一个ObservableVector类,将数据源作为成员保存,并将对它所做的所有更改传播到数据源。但是,在两种情况下,我都需要更改manipulate的签名以接受指针向量或ObservableVector。我有什么机会可以保留原始的manipulate函数(无需创建包装函数),并且仍然可以自动将数据反馈回原始源?

最佳答案

您可以将逻辑包装到一个函数中,例如:

template <typename T, typename F>
void manipulate_selection(std::vector<T>& v,
                          F f,
                          const std::vector<std::size_t>& indexes)
{
    std::vector<T> selection;

    // Select every second entry
    selection.reserve(indexes.size());
    for (auto index : indexes) {
        selection.pusk_back(v[index]);
    }

    // Manipulate selection
    f(selection);

    // Feed data back to the data source
    for (std::size_t i = 0; i != indexes.size(); ++i) {
        v[indexes[i]] = selection[i];
    }
}


然后像这样使用它:

manipulate_selection(dataSource, manipulate, {0, 2});

08-27 21:33