如何在类型依赖于派生类的基础模板类中声明成员?

传单

给定使用CRTP的基类,我正在研究在基模板类中声明一个成员,其中类型取决于派生类。

尽管以下各项按预期工作:

template <class T> class BaseTraits;
template <class T> class Base {
    using TypeId = typename BaseTraits<T>::TypeId;
    TypeId id;
 public:
    Base() { id = 123; }
    TypeId getId() { return id; }
};

class Derived;
template <> class BaseTraits<Derived> {
public:
    using TypeId = int;
};

class Derived : public Base<Derived> {};

int main(int argc, char ** argv) {
     Derived foo;
     return foo.getId();
}

我想知道是否可以简化实施。我可以在模板中添加第二个模板参数Base,并使其BaseTraits更简单甚至摆脱它。但是,以上代码段已经尝试删除第二个模板参数。我正在寻找不涉及的第二个模板参数的解决方案Base

我已经尝试过类似以下的内容,但是无法编译:

错误:无效使用不完整类型“派生类”

template <class T> class Base {
    using TypeId = typename T::TypeId;
    TypeId id;
 public:
    Base() { id = 123; }
    TypeId getId() { return id; }
};

class Derived : public Base<Derived> {
public:
    using TypeId = int;
};

int main(int argc, char ** argv) {
     Derived foo;
     return foo.getId();
}

更新:

  • 我仅限于c ++ 14。
  • Base 必须是模板。
  • 性能是必须的。
奥利夫

是否可以使成员类型直接依赖于派生类?用appart作为用auto(推断的返回类型)声明的成员函数的结果类型是不可能的。

因此,像在解决方案中一样使用类型特征是最好的也是唯一的解决方案

原因是定义派生类时,基类必须是完整类型:编译器必须首先实例化并解析基类定义,然后再解析派生类定义,C ++标准N4140 [derived.class] / 2(粗体是我的):

由base-type-specifier表示的类型应该是不是未完全定义的类的类类型; [...]

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

C ++依赖于派生类的纯虚函数

如何转发声明依赖于变体定义的类,而后者又依赖于模板化类?

模板问题,静态继承。无法为成员依赖于类型的类 Sorter 完成代码

如何在 Kotlin/Arrow 中调用依赖于多个类型类的多态函数

如何通过类型为base的指针访问派生类中的成员,但指向派生类

如何有一个依赖于类的模板参数的成员函数实现?

依赖于特定类类型的C ++模板方法?

对派生类中的成员变量使用派生类型

如何在Scala中将依赖于路径的类型与类型类一起使用

覆盖派生类中的模板基础方法?

如何填充循环模板派生类的静态成员?

如何让变量依赖于类中的其他变量?

在派生类中绑定非静态模板成员函数

如何在模板派生类中调用模板基类的构造函数?

如何在kotlin中定义类,成员可以在java派生类中访问

如何在派生类构造函数中初始化基类成员变量?

如何在派生类中初始化基类staic内联数据成员?

如何访问超类的受保护成员到其派生类。如果在派生类中已经声明了同名的函数?

如何在C#中专门化派生类的成员类型?

如何在派生类中重写模板类的静态方法

有没有办法声明作为派生类类型的抽象基类的成员?

基类中的模板化类成员,在派生类中不存在

TypeScript:如何初始化依赖于 T 的泛型类的成员?

派生类模板

在Startup类中获取依赖于DI的类的实例

覆盖派生类中的成员字段

如何在基类中使用派生类成员设计我需要的类?

基类和派生类中的模板成员之间的重载解析

尽管不同的参数列表,基类模板成员函数仍在“派生类”中隐藏