Как выставить шаблон шаблона arg - PullRequest
2 голосов
/ 11 декабря 2010

Давайте предположим, что у меня есть следующий шаблон класса:
<> - читать как шаблон

template<template<class T> class Policy>
struct
{

};

Как (без добавления дополнительных параметров к этому <>) я могу представить тип Политики внешнему миру?
typedef не будет работать, и почему для лога я не могу написать что-то вроде этого:

typedef Policy<T> Policy;

Почему я не могу использовать тип T из << param >>?Этот тип T недоступен?

Ответы [ 3 ]

1 голос
/ 12 декабря 2010

Я знаю, что это возможно с C ++ 0x, но я не знаю синтаксис.В то же время наиболее подходящим вариантом в C ++ 03 является

template <template <typename> Pol>
struct Foo
{
    template <typename T>
    struct policy
    {
        typedef Pol<T> type;
    };
};

использование: typename Foo<F>::template policy<T>::type, где вы хотели бы написать Foo::policy<T>.

1 голос
/ 11 декабря 2010

Тип T не определен. Когда вы берете шаблонный тип шаблона, компилятор ожидает неполный тип, который может быть создан с другими параметрами типа. Он не служит для извлечения типа.

template<template<typename T> class X> void func() {
};
func<std::shared_ptr>(); // correct usage
func<std::shared_ptr<int>>(); // fail
0 голосов
/ 12 декабря 2010

Как сказал DeadMG, тип шаблона шаблона является неполным.Например, неполный тип std :: vector соответствует template< template<class, class> class TypeWithTwoParams>

Чтобы вывести фактический тип T в вашем примере, вы можете предоставить аргумент (который имеет «полный тип») для функции.Например, в приведенном ниже коде мы можем вывести T, потому что мы передаем аргумент arg в качестве аргумента для PolicyRelatedFunction и он имеет полный тип, который позволяет компилятору делать необходимые выводы.

У меня такое ощущение, что вы пытаетесь это сделать, кроме как с помощью функции, а не структуры.Материал typeid как раз для иллюстрации того, что мы можем использовать T. Это выведет "T = std :: string"

template< template<class > class Policy, typename T>
void PolicyRelatedFunction(Policy<T>& arg)
{
    if (typeid(T) == typeid(int) )
        std::cout << "T = int";
    else if (typeid(T) == typeid(std::string) )
        std::cout << "T = std::string";
}

TemplatedType<std::string> arg;
PolicyRelatedFunction<TemplatedType>(arg);
// PolicyRelatedFunction(arg) works as well - compiler can figure it out.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...