Тип возвращаемого значения C++ в зависимости от количества аргументов функции ⇐ C++
-
Гость
Тип возвращаемого значения C++ в зависимости от количества аргументов функции
У меня есть следующая структура:
#define vec std::vector структура А { станд::mt19937 кольцо; std::uniform_real_distribution U; А(){} A(целое число) { rng.seed(СЭД); U = std::uniform_real_distribution(0, 100000); } шаблон vec get(std::size_t size) { vec первый (размер); для (авто &x: первый) x = U(rng); вернуться первым; } шаблон vec get(std::size_t size1, std::size_t size2) { vec rst(size1); для (авто &x: первый) get(size2).swap(x); вернуться первым; } шаблон vec get(std::size_t size1, std::size_t size2, std::size_t size3) { vec rst(size1); для (авто &x: первый) get(size2, size3).swap(x); вернуться первым; } }; #undef век Я знаю, что это может быть непростая задача, но как написать функцию-член magicGet(), чтобы при этом:
auto u = MagicGet(3, 1, 2, 5); auto v = MagicGet(7, 9, 6, 2, 2); авто w = MagicGet(6); Я получу u типа vec, v типа vec и w типа vec и т. д.? Если это невозможно, какое решение будет наиболее близким?
Обновление: приняв принятый ответ и сообщение от @Shreeyash Shrestha, самым простым решением может быть:
шаблон auto MagicGet(std::size_t size, Args... args) { если constexpr (sizeof...(args) == 0) { vec первый (размер); для (авто &x: первый) x = U(rng); вернуться первым; } else // Тело кода должно быть обернуто внутри else {}, чтобы гарантировать, что компилятор // знает, что они взаимоисключающие. { vec rst(size); for (auto &x: rst) MagicGet (args...).swap(x); вернуться первым; } }
У меня есть следующая структура:
#define vec std::vector структура А { станд::mt19937 кольцо; std::uniform_real_distribution U; А(){} A(целое число) { rng.seed(СЭД); U = std::uniform_real_distribution(0, 100000); } шаблон vec get(std::size_t size) { vec первый (размер); для (авто &x: первый) x = U(rng); вернуться первым; } шаблон vec get(std::size_t size1, std::size_t size2) { vec rst(size1); для (авто &x: первый) get(size2).swap(x); вернуться первым; } шаблон vec get(std::size_t size1, std::size_t size2, std::size_t size3) { vec rst(size1); для (авто &x: первый) get(size2, size3).swap(x); вернуться первым; } }; #undef век Я знаю, что это может быть непростая задача, но как написать функцию-член magicGet(), чтобы при этом:
auto u = MagicGet(3, 1, 2, 5); auto v = MagicGet(7, 9, 6, 2, 2); авто w = MagicGet(6); Я получу u типа vec, v типа vec и w типа vec и т. д.? Если это невозможно, какое решение будет наиболее близким?
Обновление: приняв принятый ответ и сообщение от @Shreeyash Shrestha, самым простым решением может быть:
шаблон auto MagicGet(std::size_t size, Args... args) { если constexpr (sizeof...(args) == 0) { vec первый (размер); для (авто &x: первый) x = U(rng); вернуться первым; } else // Тело кода должно быть обернуто внутри else {}, чтобы гарантировать, что компилятор // знает, что они взаимоисключающие. { vec rst(size); for (auto &x: rst) MagicGet (args...).swap(x); вернуться первым; } }
Мобильная версия