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

时间:2014-09-17 06:09:47

标签: 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;};

它是可编辑和可用的。现在,说我想使用元组而不是结构。那可能吗?似乎我无法避免为typedef需要某种(非法的)前向声明,例如:

class Record1;
class Record2;

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

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

谢谢!

1 个答案:

答案 0 :(得分:1)

滥用公共继承是获得所需内容的一种方式:

#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