Я пишу "библиотечный" класс, с 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 >>