Форвардные объявления и перекрестные ссылки в кортежах

В StackOverflow есть много вопросов, касающихся предварительных объявлений C ++, но я не нашел решения этой проблемы.

Рассмотрим следующий код:

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

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

Это компилируемо и удобно. Теперь, скажем, я хотел бы использовать кортежи вместо структур. Это возможно? Кажется, я не могу избежать необходимости какого-то (незаконного) предварительного объявления для typedefs, например:

class Record1;
class Record2;

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

Я пробовал несколько подходов, включая отчаянное злоупотребление поздним созданием шаблона, но безуспешно. Буду признателен за любые идеи.

Спасибо!

2

Решение

Злоупотребление публичным наследованием — это способ получить то, что вы хотите:

#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);
}

Живой пример.

1

Другие решения