Я экспериментирую с шаблоном-шаблоном для развлечения. У меня есть следующий класс:
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
Я попробовал несколько более или менее случайных синтаксисов, но ни один из них не скомпилирован.
Спасибо !
Вы не можете сделать псевдоним для 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;
в будущем может соответствовать счет (если предложено и принято, конечно).
поскольку 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
механик.)