(C++) кортежи для массовых операций, по возможности используя ссылки.C++

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

Сообщение Anonymous »


Чтобы уменьшить объем подробного кода, я часто использую структуры данных stl, такие как std::tuple и std::vector, в которых есть реализации для operator== (и вообще operator)

Это помогает сократить количество циклов for, проверяющих каждый индекс или последовательность операторов if, делающих то же самое.

Однако недавно мне захотелось попробовать это на следующем сценарии

#include #include #include структура ComplexStruct; Структура ПримерАккумулятор { std::string mExampleName; int mExampleType ... std::shared_pointer mExampleComplex; bool CanBeMerged( std::string inName, int inType, std::shared_pointer< ComplexStruct > inComplex ) { // Пример без использования кортежей STL if( mExampleName != inName ) возвращает false; if( mExampleType != inType ) возвращает false; ... if( bool( mExampleComplex ) != bool( inComplex ) ) возвращает false; ... // Расширенное сравнение } bool CanBeMergedShortend( std::string inName, int inType, std::shared_pointer< ComplexStruct > inComplex ) { // Пример использования кортежей STL auto current = __group__(mExampleName, mExampleType, ..., bool(mExampleComplex)); auto Other = __group__(inName, inType, ..., bool(inComplex)); if(current!=other) возвращает false; ... // Расширенное сравнение } } Однако для __group__:
[*]Я не могу использовать std::tie, поскольку некоторые входные данные являются временными (не будут компилироваться) [*]Я не могу использовать std::make_tuple, так как это вызовет конструктор копирования, который является дорогостоящим и не всегда общедоступным. [*]Я не могу использовать std::forward_as_tuple, поскольку это приведет к сохранению && во временных объектах, что приведет к висячим ссылкам. [*]Я мог бы использовать структуру с autooperator const(struct const &) = default, но это многословно, требует имени (которое не всегда будет иметь смысл) и правильного ввода ( T const & или просто T). Я использую этот подход, когда это имеет смысл. [*]наконец
решение, которое сработало для меня

шаблон Структурное хранилище { используя тип = Т; }; шаблон struct Storage< T & > { используя тип = T const &; }; шаблон struct Storage< T && > { используя тип = Т; }; шаблон constexpr std::tuple< typename Storage< Args >::type ...> Special_tie( Args && ... args) noException { вернуть {аргументы...}; } [*]Безопасно ли это (висячие ссылки)? [*]Есть ли функция STL, позволяющая это сделать? По сути, я хотел бы создать кортеж, который хранит const &, если это возможно, в противном случае просто простой тип (не &&)
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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