Контейнер, похожий на кортеж, который позволяет только уникальным типамC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Контейнер, похожий на кортеж, который позволяет только уникальным типам

Сообщение Anonymous »

Мне нужен был тип, который мог бы обобщить несколько типов, которые не могут быть преобразованы друг в друга. Например: есть 2 типа A и b . не является конвертируемым в b , b не конвертируется в . То есть это 2 совершенно разных »типах. И есть тип уникальной_tuple . Экземпляр этого типа может содержать и b , как обычный std :: tuple , но он отличается тем, что в контексте, где ожидается , он ведет себя как и в контексте, где ожидается b , он ведет себя как b . Основная идея заключается в том, что: "

Код: Выделить всё

unique_tuple
ведет себя как можно больше, например, t в контексте, где ожидается t . «[/b]. Я хотел бы иметь кортеж, который может обеспечить это поведение без использования явных конверсий типа. То есть, если функция принимает t в качестве аргумента, то это также должно принять уникальный func (unique_tuple ()) должен бросить ошибку.

Код: Выделить всё

void proc1(int arg);
void proc2(MyClass arg);
void proc3(double arg);
void proc4(int arg);
void proc4(MyClass arg);
...
unique_tuple my_tuple; // OK
unique_tuple my_tuple2; // Compilation error: int and double can be cast to each other.
my_tuple = 42; // OK
my_tuple = 3.14; // OK my_tuple.as == 3
my_tuple = MyClass{}; // OK
proc1(my_tuple); // OK
proc2(my_tuple); // OK
proc3(my_tuple); // OK
proc4(my_tuple); // Error. Call is ambiguous
Обратите внимание на то, что уникальный_tuple , в качестве законного типа, теряет свое право на существование в этом случае, поскольку он приводит к неоднозначности в любой попытке использовать его в контексте целевого типа.

Дополнительное, но необязательное требование - это то, что уникальное такого, что уникальное_т, int, int, int, int, int, int, int, int, int,>: уникальный_tuple . Это может быть простым, используя , которая выбирает определенную реализацию контейнера, используя некоторый алгоритм упорядочения параметров шаблона. Конкретная реализация некоторого упорядочения может быть даже в зависимости от компилятора. Меня не интересует конкретное представление данных в памяти и сериализации (пока). < /P>
Я уверен, что кто -то уже сделал это на более профессиональном уровне, чем я могу себе позволить. Тем не менее, я не мог найти готовые решения. Самое близкое значение, которое я нашел, это Boost :: MPL . Да, эта библиотека решает часть моих проблем при обработке пакета параметров шаблонов на стадии компиляции, но я не нашел реализацию самого кортежа. Возможно, я не полностью понял концепцию Boost :: MPL, и моя проблема решена с его помощью.
Вопрос: есть ли идиомы C ++, которые обеспечивают кортеж/контейнер с уникальными/неконвертируемыми типами? Я был бы признателен за любые примеры или ссылки на репозитории с открытым исходным кодом с аналогичной функцией. И различные алгоритмы для работы с этим графиком знают только об их типах. Или для моделирования физических процессов, мне нужны объекты, чтобы иметь различные характеристики, как будто они были чем-то другим одновременно, в зависимости от контекста. На самом деле < /p>

Код: Выделить всё

int j;
std::string s;
s = j;
s = 1;
< /code>
является юридической записью. Итак, код < /p>
unique_tuple my_tuple;
my_tuple = 42;
должна привести к ошибке двусмысленности вызова

Подробнее здесь: https://stackoverflow.com/questions/797 ... ique-types
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»