首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在C++-11中获得打字员的第一个元素

如何在C++-11中获得打字员的第一个元素
EN

Stack Overflow用户
提问于 2022-08-21 18:04:16
回答 1查看 45关注 0票数 0

我遵循C++模板完整的指南,并试图从打字员那里获得第一个元素。

以下是汇编:

代码语言:javascript
复制
#include <bits/stdc++.h>

using namespace std;

template <typename... Elements>
class Typelist;

using SignedIntegralTypes =
        Typelist<signed char, short, int, long, long long>;

template <typename List>
class HeadT;

template <typename Head, typename... Tail>
class HeadT<Typelist<Head, Tail...>> {
public:
    using Type = Head;
};

template <typename List>
using Head = typename HeadT<Typelist<List>>::Type;


int main() {
    static_assert(is_same<Head<SignedIntegralTypes>, SignedIntegralTypes>::value, "");
}

Head<SignedIntegralTypes>产生SignedIntegralTypes。我希望它能生产出signed char。为什么会发生这种情况?我该怎么解决呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-21 18:16:00

让我们解构所有的模板,一步一步。

代码语言:javascript
复制
Head<SignedIntegralTypes>

好了,现在让我们来定义一下Head是什么:

代码语言:javascript
复制
template <typename List>
using Head = typename HeadT<Typelist<List>>::Type;

因为SignedIntegralTypes是模板参数,所以List就是在这里。这就变成了:

代码语言:javascript
复制
typename HeadT<Typelist<SignedIntegralTypes>>::Type

既然SignedIntegralTypes本身就是一个:

代码语言:javascript
复制
using SignedIntegralTypes =
        Typelist<signed char, short, int, long, long long>;

全班学生如下:

代码语言:javascript
复制
typename HeadT<Typelist<Typelist<signed char, short, int, long, long long>>>::Type

如果您计算出专门化的结果,那么Typelist中的第一个类型是

代码语言:javascript
复制
Typelist<signed char, short, int, long, long long>

这就是Type的别名。A.k.a.一个SignedIntegralTypes

为了得到预期的结果,只需修复Head别名,就可以修复这个问题:

代码语言:javascript
复制
template <typename List>
using Head = typename HeadT<List>::Type;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73437029

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档