Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: COM/DCOM/ActiveX/ATL/CORBA > Специфичная реализация for each для std::map


Автор: RastaDja 29.11.2010, 17:54
Здравствуйте!
Есть задача реализовать for each для std::map.
Но задача специфична: то-есть, как известно (или я чегото не знаю) _NewEnum может вернуть нам коллекцию либо данных, либо ключей. Но мне надо, в зависимости от задачи, вернуть имена коллекции, или данные. 

я смог реализовать
Код

For each a in coll
    msgbox a
Next
Код




соответственно кодом
Код

STDMETHODIMP CVDS::get__NewEnum(LPUNKNOWN* pVal)
{
    //    возвращаем данные
    int size = m_varMap.size();
    VARIANT *pVari = new VARIANT[size];
    map<CComBSTR, CComVariant>::iterator it;
    int i;
    for (it = m_varMap.begin(), i = 0; it != m_varMap.end(); ++it, ++i){
        pVari[i] = it->second;
    }
    
    typedef CComObject< CComEnum< IEnumVARIANT, &IID_IEnumVARIANT, VARIANT, _Copy<VARIANT> > > enumVar;
    enumVar* pEnumVar = new enumVar;
    pEnumVar->Init(&pVari[0], &pVari[size], NULL, AtlFlagCopy);
    delete [] pVari;

    return pEnumVar->QueryInterface(IID_IUnknown, (void**)pVal);
}


но неудобство в том, что тут я возвращаю только данные, а если заменить соответственный код на 
Код

for (it = m_varMap.begin(), i = 0; it != m_varMap.end(); ++it, ++i){
        pVari[i].vt = VT_BSTR;
        pVari[i].bstrVal = it->first;
    }


то верну только имена


как мне реализовать чтото вроди
Код

For each a in coll
    msgbox a.key ,, a.value
Next


или же чтото вроди 
Код

For each a in coll.names
    msgbox a
Next


Или же для мап есть специфичная конструкция для for each
спасибо!

Автор: RastaDja 30.11.2010, 10:57
ХЕЛП, нможет кто знает как std::map вывести?

Автор: RastaDja 30.11.2010, 12:00
навалял такую реализацию этого:
1. создал новый класс (Class2) с коллекцией std::map  c именем m_Map
2. реализовал в Class2 свойство _NewEnum
3. в своем классе создал свойство Key
Код

STDMETHODIMP CVDS::get_Key(IClass2** pVal)
{
    // TODO: Add your implementation code here
    CComObject< Class2  >* cColl;
    CComObject< Class2 >::CreateInstance(&cColl);
    
    std::copy(m_varMap.begin(), m_varMap.end(), std::inserter(cColl->m_Map, cColl->m_Map.begin()));

    cColl->QueryInterface(IID_IClass2, (void**)pVal);
    return S_OK;
}


это позволило реализовать такой код
1. вывод данных
Код

 For Each z In mColl
        MsgBox z
 Next

2. вывод имен
Код

 For Each z In mColl.Key
        MsgBox z
 Next


всё норм работает, но зато в библиотеке появился не нужный мне клас, как мне спрятать этот клас, чтоб он был невидим?
спасибо

Автор: xvr 30.11.2010, 13:35
Лучше сделайте свой класс для элементов enum'а. класс из 2х полей - ключ и значение. Тогда foreach можно будет делать сразу и для ключа и для значения
Код

For Each z In mColl
        MsgBox z.Key
        MsgBox z.Value
 Next


Автор: RastaDja 30.11.2010, 13:51
ща попробую, а клас ATL, или простой?

Автор: xvr 30.11.2010, 14:31
Цитата(RastaDja @ 30.11.2010,  13:51)
ща попробую, а клас ATL, или простой?

ATL, dual

Автор: RastaDja 30.11.2010, 14:40
всё сделал smile  smile 
но вот та же проблема. клас для Key Value высвечивается в библиотеке, как его скрить, или это невозможно?

Автор: RastaDja 30.11.2010, 17:07
Цитата

как его скрить, или это невозможно? 

hidden

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)