繁体   English   中英

以下模板代码的奇怪行为

[英]Strange behaviour of the following template code

在下面的代码中,当注释掉指定的代码后,代码将按预期工作- 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());
}

这是因为std::string实际上只是一个typedef

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

如您所见,这是一个具有三个类型参数的类模板。

当你有一个StripTag三参数类模板作为其参数之一的StripTag专门化时,该特化是std::string比主类模板更好的匹配(因为它更具体)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM