предположим, что у нас есть следующая функция:
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}});
Edit-> после того, что люди сказали:
Так что вы, ребята, говорит, что выражение между фигурными скобками будет в основном обрабатываться как initializer_list и предлагает использовать дополнительную функцию, которая извлекает указатель из этого initializer_list и передает его намеченной функции, но этот метод мне кажется хаком, чтобы иметь возможность использовать моя предполагаемая функция с этим выражением в качестве аргумента, с тем, что я думаю, что я вообще не должен использовать это выражение в качестве аргумента, когда параметр предполагаемой функции является одним указателем, или может быть другой подход к использованию этого выражения? .
Если ваша функция принимает const int*
, а не int*
, то вам просто нужна небольшая функция-батут, чтобы вытащить указатель из std::initializer_list
, который производит инициализатор скобок. Что-то вроде этого (возможно; у меня нет компилятора 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()
в качестве второго аргумента.
Википедия , казалось бы, предполагает, что вы можете сделать это, но только объявив функцию, которая принимает в качестве аргумента std :: initializer_list
.
Тип выражения {1,2,3,4,5}
- std :: initializer_list
. Это объект, у которого есть функции-члены size ()
, begin ()
, end ()
, но нет оператора []
(на 18.9 / 1
C ++ 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});
}