(C++) кортежи для массовых операций, по возможности используя ссылки. ⇐ C++
(C++) кортежи для массовых операций, по возможности используя ссылки.
Чтобы уменьшить объем подробного кода, я часто использую структуры данных 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 &, если это возможно, в противном случае просто простой тип (не &&)
Чтобы уменьшить объем подробного кода, я часто использую структуры данных 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 &, если это возможно, в противном случае просто простой тип (не &&)
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Оптимизация событий домена для массовых операций и синхронизации базы данных в DDD
Anonymous » » в форуме C# - 0 Ответы
- 7 Просмотры
-
Последнее сообщение Anonymous
-