2012-12-15 7 views
1

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

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?

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

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

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

Спасибо!

ответ

3

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

// 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; в будущем может соответствовать счету (если это предлагается и принято, конечно).

4

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

Pre-C++ 11 вы должны что-то более notationally участвовать, как описано in this answer of mine (и используется, например, в стандартной библиотеке стандартом Распределитель-х rebind механик.)

+0

Спасибо, это именно то, что я хотел. Я отредактирую вопрос, чтобы он имел смысл – arnoo