gpt4 book ai didi

c++ - 如何展开模板特化

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:18:09 26 4
gpt4 key购买 nike

我正在尝试使用模板元编程获取参数包中指定索引处的类型。我有下面的代码,但由于某种原因它总是返回一个 int,有人能告诉我我做错了什么吗?

#include <string>
#include <iostream>
using std::cout;
using std::endl;
using std::string;

template <int current_index, typename... Vs>
struct TypeForIndex {};
template <int current_index, typename Head, typename... Tail>
struct TypeForIndex<current_index, Head, Tail...> : private TypeForIndex<current_index + 1> {
using type = Head;
};
template <int current_index, typename Tail>
struct TypeForIndex<current_index, Tail> {
using type = Tail;
};

int main() {

TypeForIndex <2, int, double, string>::type a {"hello"};
cout << a << endl;

return 0;
}

上面的代码应该返回 string 作为 a 的类型,但不知何故它总是一个 int

最佳答案

TypeForIndex<2, int, double, string>

好的,模式匹配时间到了。首先,它明显匹配

template <int current_index, typename... Vs>
struct TypeForIndex {};

所以没有错误。它是否与任何其他专业匹配?

答:

template <int current_index, typename Head, typename... Tail>
struct TypeForIndex<current_index, Head, Tail...>

乙:

template <int current_index, typename Tail>
struct TypeForIndex<current_index, Tail>

嗯,它匹配 (A) 而不是 (B)。

与 (A),current_index2 , HeadintTail...double, std::string .

template <int current_index, typename Head, typename... Tail>
struct TypeForIndex<current_index, Head, Tail...> : private TypeForIndex<current_index + 1> {
using type = Head;
};

现在,private TypeForIndex<current_index + 1>几乎没用。它始终只匹配主体为空的主要特化,并且它是私有(private)的,因此没有人会注意到它。我们可以在完全不改变程序行为的情况下将其删除。

template <int current_index, typename Head, typename... Tail>
struct TypeForIndex<current_index, Head, Tail...> {
using type = Head;
};

如上所述,Headint .所以我们得到 type=int .

就是这样。这就是为什么 typeint .

...

你做错的几乎是一切?除了编译(即存在与签名匹配的主要特化)之外,您提供的代码与您在文本中描述的内容无关。连current_index+1是一个字符串,我不希望它存在于执行您的文字描述的代码中。

抛开除主要特化之外的所有内容,这是可行的:

template <typename Head, typename... Tail>
struct TypeForIndex<0, Head, Tail...> {
using type = Head;
};
template <int current_index, typename Head, typename... Tail>
struct TypeForIndex<current_index, Head, Tail...>:
TypeForIndex<current_index-1, Tail...>
{};

它确实缺少 type 的定义如果您传递的索引太大。

我也会使用 size_t不是int .

关于c++ - 如何展开模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36255164/

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