Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Переменное число аргументов - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ В одномерном массиве с чётным количеством элементов 2N http://www.cyberforum.ru/cpp-beginners/thread637544.html
#include <iostream> #include <iomanip> #include <vector> #include <cmath> using namespace std; int main() { int n; float a;
C++ Огромный размер массива Как присвоить массиву типу char размер 10100. Или придется писать char mass[1000000... Может есть какая функция, увеличивающая размер массива? http://www.cyberforum.ru/cpp-beginners/thread637530.html
C++ cpp, перегрузка операторов
Здравствуйте. Можете, пожалуйста, объяснить, как, например, перегрузить операцию умножения вида const obj& operator*(double а), только справа. Сам сделал следующее: friend const orbital...
C++ Подсчитать количество пар
Дан массив чисел а1,...,аn. Выяснить, имеются ли в данном массиве два идущих подряд положительных элемента. Подсчитать количество таких пар.
C++ В упорядоченном по убыванию массиве найти разность между наименьшим значением и последним элементом, большим Р http://www.cyberforum.ru/cpp-beginners/thread637464.html
В упорядоченном по убыванию массиве найти разность между наименьшим значением и последним элементом, большим Р.
C++ Факториал Дано целое число N (> 0). Найти двойной факториал N: N!! = N•(N–2)•(N–4)•… (последний сомножитель равен 2, если N — четное, и 1, если N — нечетное). Чтобы избежать целочисленного переполнения,... подробнее

Показать сообщение отдельно
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
15.08.2012, 12:14
Хотя мне тоже не особо понятно, зачем вариадические темплейты сделали такими. Хотя, в принципе, догадываюсь: итеративный интерфейс обработки вариадических параметров потребовал бы
  • или перепиливания всего интерфейса вызова функций, чтобы они при вызове таскали с собой типы и их количество;
  • или же сделал бы возможными обращения ко всяким сотым аргументам, когда фактически передано три (это ваш get<> с переменной) — а это ломает напрочь исходную задумку сделать это хоть сколь-нибудь безопаснее обычных va_list.

Если вам надо передать динамическое количество динамически типизированных аргументов в функцию, то есть проверенный временем способ: затолкайте их в коллекцию и передайте эту коллекцию. std::vector<boost::any> в 200 раз понятнее этой шаблонной магии (да, магия внутри буста, но она хотя бы документирована). Да, конечно, что-нибудь вроде
C++
1
2
3
func(1, 2, 3, VA(4, "5", Object(6, 7, 8)));
// ...
void func(int a, int b, double c, const VarargsVector &varargs) { ... }
выглядит не так круто как
C++
1
2
3
func(1, 2, 3, 4, "5", Object(6, 7, 8));
// ...
void func(int a, int b, double c, Types... varargs) { ... }
Но это хотя бы работает везде (я напомню, что та же Студия вообще не поддерживает полиадические темплейты).

А ещё бонусом этот вариант даёт возможность собирать список аргументов в рантайме. Темплейты при всей своей крутизне такого никогда не смогут.
1
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru