Обобщить код, который заполняет контрольный список МФЦ?


Я использую модель-представление-презентатор (МВП) узор в MFC, который не актуален на мой вопрос, но я упоминаю его в контексте. У меня есть некоторый код, который предназначен для заполнения элемента управления список с данными из списка.

У меня есть два списка, которые имеют почти тот же код, за исключением типа список отличается и функции использовались для того, чтобы положить товар в контрольный список разный. Итак, мои вопросы:

  1. Как я могу genericize функцию этот функцию-член, чтобы я мог передать его произвольный список объектов и населения функции (т. е., что AddCustomerToListControl есть)?
  2. Кроме того genericizing это есть другие улучшения, которые будут сделаны?

(Обратите внимание на вызовы SetTopIndex так, что положение прокрутки запоминается.)

void MyDialog::SetCustomerList(const std::list<Customer*>& customers)
{
    customersListCtrl_.SetRedraw(FALSE);

    int selectedItemIndex = customersListCtrl_.GetNextItem(-1, LVNI_SELECTED);
    int topIndex = customersListCtrl_.GetTopIndex();

    customersListCtrl_.DeleteAllItems();

    if(customers.size() > 0)
    {
        for(std::list<Customer*>::const_iterator it = customers.begin();
                it != customers.end() ; it ++)
        {
            AddCustomerToListControl(*it);
        }
        customersListCtrl_.SetItemState(selectedItemIndex,LVIS_SELECTED, LVIS_SELECTED);
    }

    customersListCtrl_.SetTopIndex(topIndex);
    customersListCtrl_.SetRedraw(TRUE);
}

Обновление

Еще одна деталь-это функция AddCustomerToListControl выше требуется ссылка на элементе управления listcontrol для того, чтобы добавить в нее новые элементы (например, вызов методов insertitem и SetItemText)



637
3
c++
задан 27 октября 2011 в 10:10 Источник Поделиться
Комментарии
1 ответ

Чтобы обобщить его:

class MyDialog
{
template<typename T, typename A>
void SetCustomerList(T const& customers, A action);
....
};

template<typename T, typename A>
void MyDialog::SetCustomerList(T const& customers, A action)
{
.....
// AddCustomerToListControl(*it);
action(*it);
.....
}

// At call point:
SetCustomerList(customers, &AddCustomerToListControl);

Другие Изменения:
Вы можете использовать стандартные алгоритмы:

    for(std::list<Customer*>::const_iterator it = customers.begin();
it != customers.end() ; it ++)
{
AddCustomerToListControl(*it);
}

Можно заменить:

    std::for_each(customer.begin(), customer.end(), AddCustomerToListControl);
// or in the new code:
std::for_each(customer.begin(), customer.end(), action);

2
ответ дан 27 октября 2011 в 11:10 Источник Поделиться