При реструктуризации некоторого кода я столкнулся с «проблемой» при возврате структуры с двумя значениями. Теперь они действительно должны быть названы в честь задокументированного эффекта. Позже я хотел использовать tie
, поэтому я изменил структуру на наследование от std::pair
и просто установил ссылки. Теперь это действительно работает нормально, но вы заметите, что теперь моя структура имеет размер 24, а не 8 по сравнению с парой.
#include <tuple>
struct Transaction : public std::pair<int, int> {
using pair::pair;
int& deducted = first;
int& transfered = second;
};
//static_assert(sizeof(Transaction) == sizeof(std::pair<int, int>));//commenting in this line will fail compilation
Transaction makeTheTransaction();
void test(int& deduct, int& transfer) {
std::tie(deduct, transfer) = makeTheTransaction();
}
Возможно, очевидный метод состоит в том, чтобы перейти к функциям-членам, однако это также слишком много «шаблона» для этого случая (тогда становится проще не использовать tie
позже). Прямой memcpy, например. кортеж является прямым UB. Прямая структурная привязка также невозможна, поскольку переменные уже используются.
Мой вопрос заключается в том, что является лучшим или минимальным кодовым решением, игнорирующим повторно используемые части (и учитывая, что размер не должен превышать размер 2 целых чисел)?
ОБНОВЛЕНИЕ: В этом случае я просто сделал простую структуру и удержал возврат во временном. Для других пользователей, приходящих сюда, есть предложение библиотеки для повышения, которое, кажется, может преобразовать любую структуру в кортеж: https://github.com/apolukhin/magic_get/
struct Transaction {int deducted; int transfered; };
? - person Jarod42   schedule 20.11.2018makeTheTransaction()
. - person darune   schedule 20.11.2018std::pair
, чтобы использоватьstd::tie
. Просто используйте его:auto t = std::tie(transaction.deducted, transaction.transferred)
. - person Peter Ruderman   schedule 20.11.2018