Могу ли я ввести параметр шаблона шаблона?

#c #templates

#c #шаблоны

Вопрос:

В заголовках библиотеки C мы иногда видим следующее, чтобы улучшить разборчивость кода внутри класса:

 template<typename MyExplicitelyLongTemplateParameter>
class C
{
public:
    typedef MyExplicitelyLongTemplateParameter P;

    // Use "P" and keep your sanity.
};
  

Мой вопрос в том, можно ли сделать то же самое с параметром template template?

 template<template<typename> typename MyExplicitelyLongTemplateParameter>
class C
{
public:
    typedef /* ??? */ P;

    // Use "P" and keep your sanity.
};
  

Комментарии:

1. Я раньше не сталкивался с этим синтаксисом. Что это делает?

2. Я думаю, что это должно быть template<шаблон<имя_типа> класс MyExplicitelyLongTemplateParameter>

Ответ №1:

Вы не можете создать typedef, нет, но вы можете сократить имя:

 template <template <typename> typename MyExplicitlyLongTemplateParameter>
class C
{
public:

    template <typename T>
    struct P 
    {
        typedef MyExplicitlyLongTemplateParameter<T> Type;
    };

    // Use "P<T>::Type" and keep your sanity.
};
  

Комментарии:

1. 1, но, как отмечено в комментариях выше, это действительно должно быть <template <typename> class ...> .

Ответ №2:

В текущем стандарте вы не можете ввести параметр template. В новом, готовящемся к выпуску стандарте вы сможете….

Комментарии:

1. И как кто-нибудь сможет ввести defв новом стандарте?