C ++ std :: set метапрограммирование множество множество множество ... вложение - PullRequest
0 голосов
/ 14 февраля 2020

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

вот код для 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);*/

};

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

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

1 Ответ

0 голосов
/ 14 февраля 2020

Вы быстро обнаружите, что не можете поместить 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...