Можно ли определить псевдоним для параметра шаблона-шаблона?

Я экспериментирую с шаблоном-шаблоном для развлечения. У меня есть следующий класс:

template<template<class> class T, typename R> class Unit
{
using FullType = T<R>;
using Ratio = R;
//using Type = T;

...
};

У меня есть тип определения R а также T<R> как типы членов Ratio а также FullType,
Возможно ли псевдоним T как Type ?

Приведенная выше строка комментариев дает мне следующие ошибки на g ++ 4.7:

expected nested-name-specifier before 'Type'
using-declaration for non-member at class scope
expected ';' before '=' token
expected unqualified-id before '=' token

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

Спасибо !

1

Решение

Вы не можете сделать псевдоним для T, Следующее обсуждалось в комитете, чтобы сделать псевдоним для T (потому что очень поздний проект C ++ 11 содержал примечания, в которых говорилось, что он является псевдоним для T который Отчет о дефектах убрано).

// Courtesy of @KerrekSB
template <template <typename> class T, typename R> class Unit
{
template <typename U> using MyTemplate = T<U>;
// ...

// use e.g. MyTemplate<int> to get T<int>
};

Примечание пока MyTemplate<int> тот же тип, что и T<int>, тот MyTemplate является не такой же как T, Формулировка в http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1286 Предполагалось, что это изменится, но на последнем совещании это считалось очень специальным механизмом, который на самом деле не вписывается в то, что оказалось шаблонами псевдонимов (собственными шаблонами), и его отодвинули к рассмотрению. Чтобы получить этот эффект, using MyTemplate = T; в будущем может соответствовать счет (если предложено и принято, конечно).

3

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

поскольку T не тип, вопрос, который задают, не имеет смысла. Тем не менее, вы можете сделать псевдоним для T, лайк:

template <template <typename> class T, typename R> class Unit
{
template <typename U> using MyTemplate = T<U>;
// ...

// use e.g. MyTemplate<int> to get T<int>
};

До C ++ 11 вам нужно что-то более обозначенное, как описано в этом моем ответе (и используется, например, в стандартной библиотеке стандартным распределителем rebind механик.)

4

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