Передача инициализатора в качестве аргумента

Есть ли у инициализатора тип? если так, то что? в таком случае, как я могу заставить работать следующий код?

template <typename T>
int f(T a)
{
return 0;
}

int main()
{
f({1,2});
}

Это дает следующую ошибку:

c.cpp: 32: 2: ошибка: нет подходящей функции для вызова ‘f’
F ({1,2});
^ c.cpp: 18: 5: примечание: шаблон кандидата игнорируется: невозможно определить аргумент шаблона ‘T’ int f (T a)
^ 1 ошибка сгенерирована.

1

Решение

При написании f({1,2}) ты используешь инициализация списка.

Если вы хотите передать список инициализаторов {1,2} для функции, как вы можете сделать это так:

#include <initializer_list>
#include <iostream>

template <typename T>
int f(std::initializer_list<T> a) {
for(const T& x : a) {
std::cout << x << ", " << std::endl; // do something with the element
}
return 0;
}

int main() {
f({1,2});
}
3

Другие решения

Если вы хотите выполнить свою функцию для каждого значения в списке, вы можете сделать это:

#include <iostream>

template <typename T>
int f(T a)
{
return 0;
}

int main()
{
for (int a : {1,2})
std::cout << f(a) << std::endl;
}

Обратите внимание, что для этого требуется c ++ 11 совместимый компилятор

Если вы хотите передать список своей функции, то что-то вроде этого:

#include <iostream>
#include <initializer_list>

template <typename T>
int f(T a)
{
return 0;
}

int main()
{
std::cout << f(std::initializer_list<int>{1, 2}) << std::endl;
}
1

По вопросам рекламы [email protected]