С++ std::set метапрограммирование набор набора вложенных наборов

Я пытался реализовать n-кортеж с нуля, начиная с математической базовой упорядоченной пары, где n-кортеж (a, b, c) = упорядоченная_пара (a, упорядоченная_пара (b, c)) и упорядоченная пара представляет собой заданное представление, т.е. . упорядоченная_пара (а, б) = набор {{а}, {а, б}}

вот код для order_pair

#include <iostream>
#include <set>
#include <boost/variant.hpp>
using namespace std;
template <typename T, typename U, typename Z>
class orderd_pair{

//typedef boost::variant<int,std::string,double> cell;
private:
set<set<Z>> opair;

set<T> first;
set<U> second;

public:

set<set<Z>> Orderd_pair(T first_element, U second_element){

first.insert(first_element);
second.insert(first_element);
second.insert(second_element);
opair.insert(first);
opair.insert(second);

return opair;

}
//TO DO void print_elements(std::set<std::set<cell>> opair);*/

};

проблема заключается в том, что при попытке реализовать набор кортежей каждой упорядоченной пары должен быть вложен, т.е. для набора кортежей из трех элементов{{a},{a,{{b},{b,c}}}} и для большего количества элементов он будет вложен еще больше усложняет работу, как я могу это решить ??

также я использовал boost::variant для поддержки типов данных int, std::string и double.


person Elias Tsegaw    schedule 14.02.2020    source источник
comment
Зачем ты это делаешь? Если с ним так сложно работать, почему бы вам не использовать std::tuple?   -  person mkrieger1    schedule 14.02.2020
comment
Вы намеренно ограничиваете свою реализацию до int, std::string, double или просто не знаете, как сделать ее универсальной? Кроме того, они действительно должны быть взаимозаменяемыми (т.е. разрешено ли заменять строку на int, потому что это то, что делает вариант)   -  person Timo    schedule 14.02.2020


Ответы (1)


Вы быстро обнаружите, что не можете поместить std::set<T> в тот же контейнер, что и std::set<U>, если T отличается от U. Таким образом, вы, вероятно, в конечном итоге с

struct any_less {
    bool operator()(const std::any & lhs, const std::any & rhs) { 
        return type_index(lhs.type()) < type_index(rhs.type()); 
    }
}

using ordered_pair = std::set<std::set<std::any, any_less>>;

Кодификация вашего рекуррентного отношения.

template <typename A, typename B>
ordered_pair make_ordered_pair(A a, B b) {
    return { { a }, { a, b } };
}

template <typename A, typename B, typename C, typename... Rest>
ordered_pair make_ordered_pair(A a, B b, C c, Rest... rest) {
    return { { a }, { a, make_ordered_pair(b, c, rest...) } };
}

Но в C++ есть намного лучший тип для упорядоченных пар: std::pair. Он также имеет гораздо лучший тип для кортежей: std::tuple.

person Caleth    schedule 14.02.2020