Re: Множество классов с разным набором типовых параметров
От: Andrew Swan Россия  
Дата: 19.05.04 14:48
Оценка:
Здравствуйте, YuriS, Вы писали:

YS>Привет всем!


YS>Необходимо решить следующую проблему:


YS>Определён базовый класс (интерфейс) в котом есть мап из объектов (определяю typedef std::map< ENUM, Parameter > Parameters), как индекс должен испольсоваться определенныи набор уникальных индексов (пока пробую enum) и метод доступа к этому мапу. Проблема в том, что в классах наследниках меняется набор индексов для мапа, на что компилятор совсем не хочет согласится.


YS>Как можно решить ету задачу, может я иду по неправильному пути?


YS>Задача состоит в том, чтобы опеделить интерфеис для классов, которые имеют набор определенных параметров одинаковой структуры.



------------------

А так ли принципиально городить интерфейсы ?
Если грабли заключаются в разнородных индексах то :

Первое что приходит в голову : класс — шаблон с классом индексов в качестве параметра шаблона :


----------------------------------------

// Определяем класс - контейнер

template < class __INDEX_CLASS >
class CBaseClass 
{
protected:
    std::map< __INDEX_CLASS , Parameter > Parameters;
public:
    ...
    
    ...

    Parameter GetFuckingParameterByTemplateIndex( const __INDEX_CLASS& __Index )
    {
        std::map< __INDEX_CLASS , Parameter >::iterator itFound = 
            Parameters.find( __Index );

        if ( itFound == Parameters.end() )
        {
            throw чего-нибудь;
        }

        return itFound->second;
    }
};




//-------------------------


// Определяем конкретный индекс ( первое - что пришло в голову - 3-х мерный индекс )


class CTripleIndex 
{
protected:
    long i,j,k;
public:
    CTripleIndex( long _i, long _j, long _k )
    :
    i(_i),j(_j),k(_k)
    {}

    bool operator < ( const CTripleIndex& e )
    {
        if ( i != e.i ) 
            return i < e.i;

        if ( j != e.j )
            return j < e.j;

        return k < e.k;
    }

    CTripleIndex( const CTripleIndex& e )
        : i(e.i),j(e.j),k(e.k)
    {}

    // На сколько я помню 'operator =' тут не нужен
}

////////////////////////////


Usage :


...........

CBaseClass<CTripleIndex> ParametersContainer;

.............

Parameter __param = ParametersContainer.GetFuckingParameterByTemplateIndex( CTripleIndex( 1, 2, 3 ) );

.........

// вот и вся любовь



P.S. Писалось на вскидку. Так что особо к коду не докапываться плиз...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.