gpt4 book ai didi

c++ - 两阶段查找 : is it possible to easily mix inheritence and templates

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

简介:C++ 标准区分依赖模板参数的符号名称和不依赖模板参数的名称,这称为两阶段名称查找(参见 here )。定义模板时,会尽快解析非相关名称。另一方面,从属名称仅在模板实例化时解析。

示例:

template<class T> struct Base {
typedef T type;
static const int n = 3;
virtual int f() = 0;
int f(int x) { return x * 2; }
};

// doesn't compile!
template<class T> struct Derived : Base<T> {
type field; // The compiler doesn't know Base<T>::type yet!
int f() { return n; } // the compiler doesn't know n yet, and f(int) is maksed!
};

目前,我所做的是这样定义Derived:

template<class T> struct Derived : Base<T> {
typedef Base<T> Parent;
typedef typename Parent::type type; // correct but
using Parent::n; // boring, long
using Parent::f; // and harder to maintain
type field;
int f() { return n; }
};

对我来说,面向对象编程的主要目标之一是减少代码重复;这种破坏目的...

问题:是否有另一种方法通过使用一些我不知道的语法或聪明的技巧来定义Derived?我喜欢这样的东西:

template<class T> struct Derived : Base<T> {
using Base<T>::*; // I promise I won't do strange specializations of Base<T>
type field;
int f() { return n; }
};

编辑 澄清:也许我不够具体。想象一下,您在 Base 中有大约十个类型定义/字段/函数,以及数十个派生类,每个派生类的特定代码少于 5 行。这意味着大部分代码将由重复的 typedef 和 using 子句组成,我知道没有办法完全避免这种情况,但我希望尽量减少这种重复代码。

感谢任何让编写和维护更容易的想法!

最佳答案

T field;

这应该不是问题; T是模板参数本身,而不是依赖名称。

return n;

这确实是个问题,因为它是一个从属名称并且不知道它是成员。最简单的解决方案是

return this->n;

Base<T>::nDerived::n也可以,但我不想重复类名。

更新

type field;

不幸的是,没有比

更简单的访问依赖类型名的技巧了
typename Base<T>::type field;

关于c++ - 两阶段查找 : is it possible to easily mix inheritence and templates,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22360622/

25 4 0