Как сделать кортеж разной константности? - PullRequest
1 голос
/ 21 сентября 2019

У меня есть функция, которая возвращает несколько объектов внутри кортежа.

return std::tuple<std::vector<float>, class1, class2> (vec, instance1, instance2);

Я передаю этот кортеж в другую функцию с подписью:

void func(std::tuple<std::vector<float>, class1, class2> & data);

Я хочу изменить class1 , но не любые другие объекты в кортеже.Я попытался вернуть

return std::tuple<const std::vector<float>, class1, const class2> (vec, instance1, instance2);

и изменить подпись.

void func(std::tuple<const std::vector<float>, class1, const class2> & data);
  1. Очевидно, что подпись const std::tuple<> & data не позволит мне изменить любой из объектовв кортеже.Будет ли подпись, как в 4-й строке кода, только мешать этой конкретной функции изменять те объекты в ссылке, которую я указываю как const?
  2. В качестве альтернативы, возвращает кортеж с const объектами действительнымиили лучше, чтобы не-1021 * ссылка на этот кортеж могла изменять только не-1022 * объекты внутри?Последнее решение, если оно допустимо, было бы лучше, так как я должен передавать эти данные нескольким другим функциям в классе, и это более постоянное, общее решение вместо того, чтобы быть осторожным с сигнатурами функций.

1 Ответ

0 голосов
/ 21 сентября 2019

Это нормально.Вы можете сделать несколько элементов в кортеже const.

Фактически, это то, что map делает с pair: его пара ключ-значение имеет тип std::pair<const key_type, value_type>, чтобы предотвратить изменение ключа.

...