Используя структуру шаблона, такую как many
ниже, можно вернуть фиксированный набор, возможно, неотъемлемых объектов, и получить их с помощью структурированного связывания С++ 17 (auto [a,b,c] = f();
объявляет переменные ab и c и назначает их значение от f, возвращающее, например, структуру или кортеж).
template<typename T1,typename T2,typename T3>
struct many {
T1 a;
T2 b;
T3 c;
};
// guide:
template<class T1, class T2, class T3>
many(T1, T2, T3) -> many<T1, T2, T3>;
auto f(){ return many{string(),5.7, unmovable()}; };
int main(){
auto [x,y,z] = f();
}
Как объясняется в этих двух вопросах и ответах (Выполняет инициализацию агрегации std:: tuple и std:: pair?
и особенно принятый ответ ecatmur, также Множественные возвращаемые значения (структурированные привязки) с неизменяемыми типами и гарантированное RVO в С++ 17), std::tuple
не поддерживает агрегатную инициализацию. Это означает, что он не может использоваться для хранения и возврата неизменяемых типов. Но простая структура типа many
может сделать это, что приводит к вопросу:
Можно ли создать вариационную версию many
, которая работает с любым количеством аргументов?
Обновление: в шаблонной версии many
разрешен ли следующий синтаксис?
template<typename Args...>
many(Args...) -> many<Args...>;