Можем ли мы передать массивы в качестве аргументов для функций этим синтаксисом в соответствии с существующими стандартами С++ 0x?
предположим, что мы имеем следующую функцию:
void someFunction(int * araye){
for (int i=0;i<5;i++)
cout <<araye[i]<<' ';
cout <<'\n';
}
можем ли мы передать массив этой функции, следуя синтаксису, в соответствии с существующими стандартами С++ 0x?
someFunction({1,2,3,4,5});
если это правда, мы даже сможем использовать этот синтаксис в любом случае, в котором элементы массива относятся к типам POD, как показано ниже:
class Test{
int adad1;
int adad2;
};
void someFunction(Test * araye){
for (int i=0;i<3;i++)
cout <<araye[i].adad1<<'-'<<araye[i].adad2<<' ';
cout <<'\n';
}
someFunction({{1,2},{3,4},{5,6}});
Изменить- > после того, что сказали люди:
Поэтому вы, ребята, говорите, что выражение между фигурными скобками будет в основном рассматриваться как initializer_list и предлагает использовать дополнительную функцию, которая вытаскивает указатель из этого файла initializer_list и передает его назначенной функции, но этот метод кажется мне взломанным быть в состоянии использовать мою предназначенную функцию с этим выражением в качестве аргумента, при этом я думаю, что я не должен использовать это выражение как аргумент вообще, когда мой предназначенный параметр функции является единственным указателем или может быть другой подход к использованию это выражение?.
Ответы
Ответ 1
Если ваша функция принимает const int*
, а не int*
, вам просто нужна небольшая функция батута, чтобы вытащить указатель из std::initializer_list<int>
, который производит инициализатор скобок. Что-то вроде этого (возможно, у меня нет компилятора С++ 0x для тестирования)
void someFunction(const int * array){
for (int i=0; i<5; i++)
std::cout << array[i] << ' ';
std::cout << '\n';
}
void someFunction(const std::initializer_list<int>& init) {
someFunction(init.begin());
}
someFunction({1,2,3,4,5});
Если ваша функция должна знать конец или размер массива (как правило, это будет так), то передайте либо init.end()
, либо init.size()
в качестве второго аргумента.
Ответ 2
Тип выражения {1,2,3,4,5}
равен std::initializer_list<int>
. Это объект, который имеет функции-члены size()
, begin()
, end()
, но не operator[]
(per 18.9/1
CCD 0x FCD)
Если ваша функция заняла std::vector или любой другой стандартный контейнер, это будет работать, потому что контейнеры могут быть построены из initializer_lists (все они предоставляют неявные конструкторы, которые их принимают):
void someFunction(std::vector<int> araye)
{
for (int i=0;i<5;i++)
std::cout << araye[i] <<' ';
std::cout <<'\n';
}
int main()
{
someFunction({1,2,3,4,5});
}
Если вы хотите иметь функцию, которая принимает указатель, вам нужно как-то вручную преобразовать initializer_list в то, к чему вы можете получить доступ таким образом:
void someFunction(int* araye)
{
for (int i=0;i<5;i++)
std::cout << araye[i] <<' ';
std::cout <<'\n';
}
void someFunction(std::vector<int> v)
{
someFunction(&v[0]);
}
int main()
{
someFunction({1,2,3,4,5});
}
Ответ 3
Wikipedia может показаться, что вы можете это сделать, но только объявив, что функция принимает std::initializer_list<int>
как аргумент.