Как задать некоторые параметры шаблона?
От: What Беларусь  
Дата: 26.06.04 16:06
Оценка:
Я пишу "библиотечный" класс, с N = 5 стратегиями.
template <typename T1, typename T2, ... , typename TN> class CMyClass;

В большинстве случаев используется один и тот же набор параметров.
Пользователи класса хотят иметь возможность задавать "отклонения" от этого набора.
Например, задать параметр T3, а остальные оставить по умолчанию и даже не задумываться об их значении.
Как это реализовать?

У меня есть несколько вариантов:
1. Параметры по умолчанию:
template <typename T1 = CDefault1, ..., typename TN = CDefaultN> class CMyClass;

Это для пользователей класса неудобно, так как для того, чтобы задать параметр T3, придётся задавать T1 и T2.

2. Использовать traits.
template <typename TID> class CMyClass
{
    typedef CMyClassTraits1<TID>::T T1;
    ...
    typedef CMyClassTraitsN<TID>::T TN;
};

template <typename TAnyID> struct CMyClassTraits1
{
    typedef T CDefault1;
};

template <typename TAnyID> struct CMyClassTraitsN
{
    typedef T CDefaultN;
};

// Использование (задаём третий параметр)
template <> struct CMyClassTraits3<CSomeID>
{
    typedef T CUserPolicy3;
};

class CUserClass
{
    CMyClass<CSomeID> v;
};

Это мне кажется не очень удобным в данной ситуации, так как:
а) Приходится делать тип-идентификатор
б) Для задания каждого параметра нужно писать 3 строки кода

3. "Перегружать" typedef
template <typename TParams> class CMyClass
{
    typedef typename TParams::T1 T1;
    typedef typename TParams::T2 T2;
    ...
    typedef typename TParams::TN TN;
};

// Использование (задаём третий параметр)
struct CUserParams : public CMyClassDefaultParams
{
    typedef CUserPolicy T3;
};

class CUserClass
{
    CMyClass<CUserParams> v;
};

Этот вариант мне больше всего нравится:
а) Прозрачно, просто
б) Для задания каждого следующего параметра + 1 строка кода
в) Можно выделить часто используемые наборы в отедльный h-ник.

Может есть другие идеи, комментарии, критика?
Основным критерием является удобство использования класса пользователями.

P.S.
У меня стойкое ощущение, что я изобретаю велосипед
... << RSDN@Home 1.1.3 stable >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.