Рекурсивные типы в Си++
2024-06-23 11:54Оказывается, в Си++ есть возможность определять рекурсивные типы. Представьте, что нам нужны списки вида std::list, где элементом списка может быть число, строка или тот же список.
Решение в лоб не работает: Ситуация не безнадёжна, однако. Есть способ определить List отложенным образом:
Решение в лоб не работает:
Поменяем местами, опять не годится:using Integer = long long;
using String = std::string;
using List = std::list<Term>; ⟸ здесь Term не определено
using Term = std::variant<Integer, String, List>;
using Integer = long long;
using String = std::string;
using Term = std::variant<Integer, String, List>; ⟸ здесь List не определено
using List = std::list<Term>;
#include <string>
#include <variant>
#include <list>
#include <iostream>
using Integer = long long;
using String = std::string;
struct List;
using Term = std::variant<Integer, String, List>;
struct List : public std::list<Term> {};
int main()
{
std::cout << "sizeof Integer = " << sizeof(Integer) << '\n';
std::cout << "sizeof String = " << sizeof(String) << '\n';
std::cout << "sizeof List = " << sizeof(List) << '\n';
std::cout << "sizeof Term = " << sizeof(Term) << '\n';
}
Эта программа выдаёт:sizeof Integer = 8 sizeof String = 24 sizeof List = 24 sizeof Term = 32

no subject
Date: 2024-06-24 19:47 (UTC)no subject
Date: 2024-06-24 19:59 (UTC)