Есть ли способ частично связать шаблон с типами параметров? Например, у меня есть следующий шаблон:
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> { };
Однако я надеюсь избежать этого, поскольку это вызывает проблемы с конструкторами и операторами, определенными в базовом классе.
В 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
};
Других решений пока нет …