Вызов / создание экземпляра функции явно с помощью «шаблонного шаблона» - PullRequest
0 голосов
/ 05 апреля 2011

Следующий код работает нормально:

template<typename T>
struct Wrap {};

template<template <class> class OUT, typename IN>
void Extract (OUT<IN> *obj)
{ /* only class 'IN' is used in some way */ }

int main ()
{
  Wrap<int> obj;
  Extract(&obj);
}

Но я передаю аргумент-указатель для извлечения внешнего типа и внутреннего типа.

Есть ли лучший способ, с помощью которого я могу вызватьметод с явным созданием шаблона?Extract<Wrap<int> > ();

Редактировать:

Я опишу свой вопрос немного подробнее.Это объясняет, почему простой ответ, такой как Extract<Wrap, int>();, невозможен.Я пишу анализатор текста, для кода C ++.Где бы парсер не находил,

x = (Type) y; 

он должен конвертироваться в

x = Extract<Type> (y);

Теперь тип может быть

  1. любым нормальным типом, например, int* или A**
  2. некоторый шаблонизированный шаблон, такой как Wrap<A>

Теперь Extract() работает по-разному для обоих случаев.Я должен выяснить, используя шаблон, будь то Extract<int*> или Extract<Wrap<int> >.

==> На более простом языке этот метод можно назвать:

  1. Extract<int*>()
  2. Extract<Wrap<int> >()

Я могу выяснить, вызывается ли он в первом случае, но как я могу определить, вызывается ли он во втором случае?(при условии, что я также хочу знать внутренний тип).

Ответы [ 2 ]

0 голосов
/ 05 апреля 2011

отлично работает

template<typename T>
struct Wrap {};

template<template <class> class OUT, typename IN>
void Extract ()
{
    IN x; // IN => int
} 

int main ()
{
  Wrap<int> obj;
  Extract<Wrap, int>();
}

Вам определенно не хватает базовых знаний о шаблонах C ++. Прочитайте книгу Шаблоны C ++ - Полное руководство .

0 голосов
/ 05 апреля 2011

Как насчет Extract<Wrap, int> (&obj);?

Но почему вы хотите указать это явно?В большинстве случаев вы предпочитаете, чтобы компилятор автоматически выводил типы для вас.

РЕДАКТИРОВАТЬ: Рассматривали ли вы просто специализацию для Wrap<U>?

#include <iostream>

template<typename T>
struct Wrap {};

template <class T>
struct Foo
{
static void Extract()
{
    std::cout << "Base type" << std::endl;
    // Stuff
}
};

template <class U>
struct Foo<Wrap<U> >
{
static void Extract()
{
    std::cout << "Extract<Wrap<U> >" << std::endl;
    // Stuff for Wrap
}
};

int main ()
{
  Foo<int>::Extract();
  Foo<Wrap<int> >::Extract ();
}

При необходимостиМожно также добавить специализацию для T*.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...