Частичная привязка шаблона, создание нового шаблона как типа

Есть ли способ частично связать шаблон с типами параметров? Например, у меня есть следующий шаблон:

template<typename T, typename Q> struct generic { };

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

template<typename T, template<typename> class Impl>
struct wrapper {
Impl<T> foo;
};

Это примет простой шаблон, как template<typename T> без изменений. То, что я хочу сделать сейчас, это частично связать generic шаблон, указав только Q и передать его wrapper, Составляем некоторый синтаксис, возможно, что-то вроде этого:

template<typename T> bound = generic<T,some_type>;

Я знаю, что могу почти получить то, что хочу, используя наследование:

template<typename T> bound : public generic<T,some_type> { };

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

2

Решение

В C ++ 11 вы можете использовать псевдонимы шаблона

template<class X>
using Bind_CPP11 = generic<X, Y>;

template<class X, template<class> class Impl>
struct wrapper_CPP11
{
Impl<X> foo;
};

В C ++ 98/03 вы можете использовать простые классная композиция (Я бы не использовал наследование здесь)

template<class X>
struct Bind_CPP03
{
typedef generic<X, Y> type;
};

template<class X, template<class> class Impl>
struct wrapper_CPP03
{
typename Impl<X>::type foo;
//  ^^^^^^^^ to extract dependent type
};

Живой пример.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]