Странное поведение следующего кода шаблона - PullRequest
1 голос
/ 11 января 2012

В приведенном ниже коде, когда зашифрованный код закомментирован, код работает должным образом - Type соответствует (первому) аргументу шаблона.

Однако, если я раскомментирую его, Type станет char вместо std::string.Это то же самое с MSVC и GCC.Так что это работает, когда у меня есть специализация StripTag для шаблона тега с одним и двумя аргументами, но когда я точно так же специализирую его для трех аргументов, я получаю это странное поведение.

У любого естьидеи?

Код следует:

#include <typeinfo>
#include <stdio.h>
#include <string>

template <typename T>
struct StripTag
{typedef T Type;};

template<typename T, template<typename T> class Tag >
struct StripTag<Tag<T> >
{ typedef typename StripTag<T>::Type Type; };

template<typename T, typename X, template<typename T, typename X> class Tag >
struct StripTag<Tag<T,X> >
{ typedef typename StripTag<T>::Type Type; };

/*
//UNCOMMENT THIS AND RECOMPILE
template<typename T, typename X, typename Y, template<typename T, typename X, typename Y> class Tag >
struct StripTag<Tag<T,X,Y> >
{ typedef typename StripTag<T>::Type Type; };
*/

template <class C>
struct Test
{
typedef C Type;
};

template <typename A, typename B>
struct Blah{};

int main()
{

    printf("typeid of StripTag=\t%s\n", typeid(StripTag<std::string>::Type).name());
    printf("typeid of StripTag2=\t%s\n", typeid(StripTag<Blah<std::string, bool> >::Type).name());
    printf("typeid of Test=\t\t%s\n", typeid(Test<std::string>::Type).name());
    printf("typeid of std::string=\t%s\n", typeid(std::string).name());
}

1 Ответ

3 голосов
/ 11 января 2012

Это потому, что std::string действительно просто typedef для

std::basic_string<char, std::char_traits<char>, std::allocator<char>>

Это, как вы можете видеть, шаблон класса с тремя параметрами типа.

Когда у вас естьStripTag специализация, которая принимает шаблон класса с тремя параметрами в качестве одного из своих параметров, эта специализация лучше подходит для std::string, чем шаблон основного класса (потому что он более конкретен).

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