можем ли мы передавать массивы в качестве аргументов функциям с помощью этого синтаксиса в соответствии с будущими стандартами c ++ 0x? - PullRequest
11 голосов
/ 06 августа 2010

предположим, у нас есть следующая функция:

void someFunction(int * araye){
 for (int i=0;i<5;i++)
  cout <<araye[i]<<' ';
 cout <<'\n';
}

Можем ли мы передать массив этой функции, следуя синтаксису в соответствии с будущими стандартами c ++ 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 и передает его намеченной функции, но этот метод мне кажется хаком для быть в состоянии использовать мою предполагаемую функцию с этим выражением в качестве аргумента, с тем, что я думаю, что я вообще не должен использовать это выражение в качестве аргумента, когда параметр предполагаемой функции является одним указателем, или может быть другой подход для использования это выражение? .

Ответы [ 3 ]

5 голосов
/ 06 августа 2010

Тип выражения {1,2,3,4,5} равен std::initializer_list<int>. Это объект, который имеет функции-члены size(), begin(), end(), но не operator[] (на 18.9/1 CCD 0 ++ 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});
}
4 голосов
/ 06 августа 2010

Если ваша функция принимает const int*, а не int*, то вам просто нужна небольшая функция батута, чтобы вытащить указатель из std::initializer_list<int>, который производит инициализатор фигурной скобки.Примерно так (возможно, у меня нет компилятора C ++ 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 голосов
/ 06 августа 2010

Википедия может показаться, что вы можете сделать это, но только объявив функцию, чтобы принять std::initializer_list<int> в качестве аргумента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...