2013-08-05 1 views
2

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

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> { }; 

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

+1

'template using bound = generic ;'? AKA "template-typedef"? –

+0

@BartekBanachewicz, это выглядит хорошо ... Я не могу его протестировать, так как я на GCC 4.6, который еще не поддерживает его. Вероятно, это означает, что нет более ранней функции, которая делает это. –

+0

Эта функция также известна как * Псевдонимы шаблонов * и в соответствии с [этой диаграммой] (http://gcc.gnu.org/projects/cxx0x.html) она действительно поддерживается с '4.7'. –

ответ

4

В 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, вы можете использовать простой class composition (я бы не использовать наследование здесь)

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 
}; 

Live Example.

+0

Композиция, требующая 'wrapper', изменила бы ее тип ссылки. Я не уверен, могу ли я сделать это в моем случае, но ответ по-прежнему прекрасен. –

+0

@ edA-qamort-ora-y да, поэтому, если вы перейдете на C++ 11, исправление 'wrapper' будет TODO – TemplateRex