gpt4 book ai didi

C++ 递归类型特征

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:30:35 25 4
gpt4 key购买 nike

我正在尝试实现一个模板类(此处名为 Get<>),给定结构 H , 类型 Get<H>::typeH本身如果 qualified-id H::der不存在,并且是 Get<H::der>::type除此以外。我无法理解以下代码有什么问题:

#include <iostream>
#include <typeinfo>
using namespace std;

template<class U, class V = void>
struct Get
{
static const char id = 'A';
typedef U type;
};

template<class U>
struct Get<U,typename U::der>
{
static const char id = 'B';
typedef typename Get<typename U::der>::type type;
};

struct H1
{ };
struct H2
{ typedef double der; };
struct H3
{ typedef void der; };
struct H4
{ typedef H2 der; };

void print(char id, const char* name)
{
cout << id << ", " << name << endl;
}
int main(int , char *[])
{
print(Get<H1>::id, typeid(Get<H1>::type).name()); // prints "A, 2H1", OK
print(Get<H2>::id, typeid(Get<H2>::type).name()); // prints "A, 2H2", why?
print(Get<H3>::id, typeid(Get<H3>::type).name()); // prints "B, v" , OK
print(Get<H4>::id, typeid(Get<H4>::type).name()); // prints "A, 2H4", why?
}

我需要一些帮助来使这段代码按预期运行。更具体地说,我希望 Get< H2 >::type等于 double , Get< H4 >::type 也一样.

最佳答案

模板Get<>有一个默认的模板参数——这是非常危险的。取决于是否V等于int , voiddouble你得到不同的结果。这是发生了什么:

Get<H2>::typeGet<H2, void>首先(使用 id='A' )。现在来检查,是否有它的特化。你的 B 是 Get<U,typename U::der>变成Get<U, double> .但这与 Get<H2, void> 不匹配, 所以 A被选中。 Get<H2>::type 让事情变得有趣起来.那么变体B也是Get<U, void>并提供更好的匹配。但是,该方法并不适用于所有类型。

这就是我实现 Get 的方式:

template<class U>
class Get
{
template <typename T, typename = typename T::der>
static typename Get<typename T::der>::type test(int);
template <typename T>
static T test(...);
public:
typedef decltype(test<U>(0)) type;
};

关于C++ 递归类型特征,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13541850/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com