gpt4 book ai didi

C++:使用基类中的仅派生类变量

转载 作者:行者123 更新时间:2023-11-30 05:10:32 24 4
gpt4 key购买 nike

假设我有两个相似的结构 A 和 B。A 和 B 都有一个指向 A 的指针,但是 A 有一个额外的指向 A 或 B 的指针。

我想到了类似这样的东西,有一个 Base 和一个 Derived 类

template <bool T> struct Derived;
struct Base { Derived<0> *p1; };
template <> struct Derived<0> : public Base { Base *p2; };
template <> struct Derived<1> : public Base {};

其中 A 是 Derived<0> B 是 Derived <1> .

这里的问题是当通过p2访问一个类时, 编译器不知道它是哪个 Derived 类,像这样会报错。

Derived<0> x, y, z;
x.p2 = &y;
y.p2 = &z;
x.p2->p2; // Error

你们中有人知道任何神奇的解决方法,最好只使用编译时功能吗?

我还需要知道我使用的是哪种类型的 Derived,以便我知道我是否可以使用 p2。

如果有帮助,您可以将事物可视化为双链表,其中 Derived<0>是一个普通节点,Derived<1>是结束节点,p1prev 指针和 p2下一个指针。

编辑:不需要使用Base-and-Derived-class-type结构,可以是任何东西。

最佳答案

一种可能的解决方案是基于双重调度,这与最著名的访问者模式背后的想法相同。

它遵循一个最小的工作示例:

#include<iostream>

template<int>
struct Derived;

struct Visitor {
template<int N>
void visit(Derived<N> &);
};

struct Base {
Derived<0> *p1;
virtual void accept(Visitor &) = 0;
};

template<>
struct Derived<0>: public Base {
void accept(Visitor &) override;
Base *p2;
};

template<>
struct Derived<1>: public Base {
void accept(Visitor &) override;
};

template<>
void Visitor::visit(Derived<0> &d) {
std::cout << "Derived<0>" << std::endl;
d.p2->accept(*this);
}

template<>
void Visitor::visit(Derived<1> &) {
std::cout << "Derived<1>" << std::endl;
}

void Derived<0>::accept(Visitor &v) {
v.visit(*this);
}

void Derived<1>::accept(Visitor &v) {
v.visit(*this);
}

int main() {
Visitor v;
Derived<0> x, y;
Derived<1> z;
x.p2 = &y;
y.p2 = &z;
x.p2->accept(v);
}

wandbox 上查看它的启动和运行情况.

如果您可以使用 C++17 和 std::variant,事情就会简单得多:

#include<iostream>
#include<variant>

template<int>
struct Derived;

struct Base {
Derived<0> *p1;
};

template<>
struct Derived<0>: public Base {
std::variant<Derived<0> *, Derived<1> *> p2;
};

template<>
struct Derived<1>: public Base {};

struct Visitor {
void operator()(Derived<0> *d) {
std::cout << "Derived<0>" <<std::endl;
std::visit(*this, d->p2);
}

void operator()(Derived<1> *) {
std::cout << "Derived<1>" <<std::endl;
}
};

int main() {
Visitor v;
Derived<0> x, y;
Derived<1> z;
x.p2 = &y;
y.p2 = &z;
std::visit(v, x.p2);
}

wandbox 上查看它的启动和运行情况.

关于C++:使用基类中的仅派生类变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45642248/

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