gpt4 book ai didi

c++ - 从派生类中的模板化基类使用 typedef/using

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

在访问using从具有模板化基类的基类开始,如果没有别的,我遇到了冗长的问题。在下面的代码中,派生类尝试使用 my_type来自其基类。

template <typename T>
class Base {
public:
using mytype = T;
};

template <typename T>
class Derived : public Base<T>{
public:
// using the base's mytype here
static typename Base<T>::mytype func() { return 0;}
};

然而,在实践中,我发现这是一个非常多的字符,因为它看起来应该更简单。如果 Base 类没有被模板化,那么它就不需要 <T>或类型名称(显然)。

在我的实际问题中,我有大量从基础派生的类,如果可能的话我想简化它。我现在所拥有的就像下一个例子,我只是添加了一个额外的 using从基类获取类型,但它感觉像是我不需要的额外层。

template <typename T>
class Derived : public Base<T>{
public:
using base_type = typename Base<T>::mytype;
static base_type func() { return 0;}
};

这似乎是一个愚蠢的问题,但是基类的 mytype 的次数在派生类中使用使得它在前一种情况下非常可怕。是否有正确的方法从模板化基础中获取类型以保持可读性?

最佳答案

这是众所周知的语言怪癖,没有真正的解决方案。模板中的查找分两个独立的步骤完成,在查找的第一阶段之前实例化非依赖名称解析为它们的含义,而在第二阶段依赖名称​​之后解析em> 实例化。

语言中包含两个阶段的划分,以便为不知道模板将在何处实例化的模板开发人员提供一些理智。查找的第一阶段是在定义模板的地方完成的,开发人员可以恰好在那个地方进行推理。在某一时刻,模板将执行依赖于参数的操作,并且无法在定义模板的地方解析这些操作,因为模板参数尚未固定。这些名称被认为是相关的,查找被推迟到第二阶段,在替换模板参数之后,以便 ADL 可以启动。

这与您的特定问题有什么关系?当您从非模板基类继承时,开发人员已经确定了基类是什么,并且可以如您期望的那样在模板定义点进行查找。但是当基依赖于模板参数时,基 的定义在派生模板定义的位置是未知的。特别是,如果不替换类型,编译器就不可能知道是否存在针对该特定类型的特化。这意味着在第一阶段,编译器不能对基进行任何假设,因此查找不能搜索到它。

在基类中使用 typedef 的直接方法是派生模板的开发人员明确告诉编译器它需要一个类型,并且该类型在实例化中定义基本模板。这里的关键点是编译器对基类一无所知,但开发人员可以要求使用此模板遵守基类实例化必须的约定有那个嵌套类型。开发人员可以自由地在她的模板类型上添加约束,编译器不能。

它的语法是第一个 block 中的语法:typename Base<T>::type引用类型,它告诉编译器使用契约(Contract)要求无论T用于实例化Derived , 用户需要确保 Base<T>将包含一个嵌套成员 type那是一种类型( typename )。简而言之,您可以选择第二种方法:创建一个本地 typedef,它将在 Derived 中找到。并下定决心。在这种情况下,第一阶段的常规查找将找到嵌套的 typedef,确定它引用了从属名称并推迟第二阶段的完整查找。

虽然这不是对是否有更好方法(可读性方面)的问题的回答,但我希望它能提供一些关于为什么事情是这样的理解。设计语言时的决定不是随意的[它可能是理想的,也可能不是理想的,有些人认为第一阶段是不需要和不需要的,但这不是随意的]

关于c++ - 从派生类中的模板化基类使用 typedef/using,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19816509/

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