gpt4 book ai didi

C++:模板参数循环依赖

转载 作者:行者123 更新时间:2023-11-28 03:58:33 25 4
gpt4 key购买 nike

这与其说是一个语言问题本身,不如说是一个最佳实践问题,因为我已经有了一个可行的解决方案来解决似乎是 C++ 中常见绊脚石的问题。

我正在处理模板参数替换中的典型循环依赖问题。我有以下一对类:

template<class X>
class A { /* ... */ };

template<class X>
class B { /* ... */ };

我想将每个实例化如下:

// Pseudocode -- not valid C++.
A<B> a;
B<A> b;

也就是说,我想将 A 绑定(bind)到 B,将 B 绑定(bind)到 A。

我可以通过带有继承技巧的前向声明以粗略的方式解决问题:

class sA;
class sB;

class sA : public A<sB> { /* ... */ };
class sB : public B<sA> { /* ... */ };

但这会带来一系列问题,因为 sAsB 实际上不是 AB .例如,如果不将 A 的构造函数正确复制到 sA 中,或者以某种方式在代码周围闪闪发光,我就无法调用它们。

我的问题是:处理此问题的最佳实用方法是什么?这个问题有什么特别聪明的解决方案吗?

我同时使用 MSVC2008 和 G++,但欢迎使用具有编译器特定扩展的解决方案。

谢谢,

阿莱克

最佳答案

如前所述,处理此问题的最佳实用方法是重构 - 通过解耦打破依赖关系。

可能的选项包括:

  • 使用虚拟方法的接口(interface)
  • 静态接口(interface)(可能使用类型特征或概念检查)
  • 在一侧或两侧使用回调(可能通过仿函数或信号缓解)

这也会在您的要求突然发生变化时为您提供帮助。假设在某些情况下您需要一个特殊的 server - 它当然应该支持您已经编写的所有客户端,您不想重写它们。或者在某些情况下你需要一些特殊的client...
使用您的方法,这将需要重写双方,而采用解耦方法,只需编写您需要更改的一方的修改版本即可。

例如与客户的静态方法:

template<class server>
class client {
server& srv;
public:
client(server& srv) : srv(srv) {};
void work(const request& req) {
srv.add_job(make_job(req));
}
};

在这里,client 甚至不需要知道 server 的具体类型 - 如果它没有成员函数 add_job(job&) 或其他兼容的东西,编译将失败。
如果您想变得更正式,您可以研究静态断言和概念检查。

关于C++:模板参数循环依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2143327/

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