c++ - 元组中的前向声明和交叉引用

标签 c++ templates typedef forward-declaration cross-reference

StackOverflow 中有很多关于 C++ 前向声明的问题,但我没有找到解决此问题的方法。

考虑以下代码:

struct Record1; // Forward declaration.
struct Record2; // Forward declaration.

struct Record1 {int a; Record2 *r2;};
struct Record2 {int b; Record1 *r1;};

它是可编译且可用的。现在,假设我想使用元组,而不是结构。那可能吗?看来我无法避免需要某种类型的(非法的)前向声明,例如:

class Record1;
class Record2;

using Record1 = std::tuple<int, Record2*>; // No go. Conflicting declaration.
using Record2 = std::tuple<int, Record1*>; // Same here.

我尝试了多种方法,包括拼命滥用后期模板实例化,但没有成功。如果有任何想法,我将不胜感激。

谢谢!

最佳答案

滥用公共(public)继承是获得你想要的东西的一种方法:

#include <iostream>
#include <tuple>

class Record1;
class Record2;

class Record1: public std::tuple<int, Record2*> { using base = std::tuple<int, Record2*>; using base::base; };
class Record2: public std::tuple<int, Record1*> { using base = std::tuple<int, Record1*>; using base::base; };

int main() 
{
    Record1 r1 = std::make_tuple(0, nullptr);        
    std::cout << (std::get<0>(r1) == 0) << (std::get<1>(r1) == nullptr);
}

Live Example .

关于c++ - 元组中的前向声明和交叉引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25883433/

相关文章:

c++ - 在 OpenCV 中查找多边形边界内的平均颜色

c++ - 为什么ubuntu 12.04下的OpenMP比串口版本慢

c++ - 如何编写最薄的类型包装器

c++ - Dijkstra 算法输出不正确

c++ - 如何在 header 中使用尚未定义的数据类型?

c++ - 如何使用 C++11 使用语法对函数指针进行类型定义?

C++ 错误 C2061 - typdef 定义

c++ - 在模板类中构造对象需要异常初始化

C++ 派生类重载函数(带有 std::function 参数)不可见

c++ - 在 C++ 中使用模板