2010-08-06 2 views
10

우리가 기능을 다음했다고 가정 :우리는 향후 C++ 0x 표준에서이 구문에 따라 함수에 인수로 배열을 전달할 수 있습니까?

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

우리는 0X 표준 ++ 곧 C에서, 구문에 따라이 함수에 배열을 전달 할 수 있습니까? :

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}}); 

편집 -> 어떤 사람들 후 said :
여러분은 중괄호 사이의 표현식이 기본적으로 initializer_list로 취급되며이 initializer_list에서 포인터를 가져 와서 의도 된 함수로 전달하는 추가 함수를 사용하여 제안 하겠지만이 방법은 나는 내에서 사용할 수있는 해킹을 좋아한다. 그 표현식을 인수로 사용하는 경향이 있다고 말하면서, 의도 한 함수 매개 변수가 단일 포인터이거나 그 표현식을 사용하는 또 다른 접근법이있을 때 그 표현식을 인수로 사용하면 안된다고 생각합니다. .

+0

'char' 배열과 같은'int' 배열을 영원히 치료 한 것은 달콤 할 것입니다 ... –

답변

4

는, 당신은 단지 브레이스 initialiser이 생산하는 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()을 전달하십시오.

+0

'initializer'를'initializer_list'로 변경 한 후 g ++ 4.4.4로 컴파일하고 실행합니다. – Cubbi

+0

@Cubbi : 오 예. 고쳤다. –

2

Wikipedia이 작업을 수행 할 수 있다고 제안하는 것처럼 보일 수도 있지만 함수를 선언하여 std::initializer_list<int>을 인수로 취해야합니다.

+0

그래,하지만 그것은 하나의 포인터와 다릅니다. – Pooria

+0

@Pooria : 구현에 따라 다를 수도 있고 그렇지 않을 수도 있습니다. 구현은'initializer_list '을 기본적으로 준수하는 범위 내에서 기본적으로 만족스럽게 처리한다. 그것은 단지 정적 데이터 영역에있는 배열 일 수 있으며,'begin()'메소드는'const T *'를 반환 할 수 있습니다. –

+0

@Jon : C++ 0x 초안 표준에 따르면'begin()'*은 단지'const T *'를 반환합니다. –

4

표현식 {1,2,3,4,5}의 유형은 std::initializer_list<int>입니다. 이 멤버 함수 size(), begin(), end()을 가진 개체 만

함수는 표준 : : 벡터 또는 다른 표준 컨테이너를했다 경우,이 용기 때문에 일하는 것이합니다 (C + +0 FCD의 18.9/1 당) 어떤 operator[]입니다 (그들은 모두 데리고가 아닌 명시 적으로 생성자 제공) 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을 변환해야합니다 당신을 다음과 같은 방식으로 액세스 할 수 있습니다.

0 함수가 const int*보다는 int* 걸리는 경우
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}); 
} 
+0

'initializer_list'를'이동 '하는 것이 더 효율적일 수 있습니다. –

+0

@ 존 : 이것을 확장 할 수 있습니까? – sbi

+1

@sbi : 신경 쓰지 마시고, @ David의 답변에 대한 의견을 참조하십시오. 'someFunction (std :: initializer_list v) {someFunction (v.begin());을 쓸 수 있습니다. }'대신'initializer_list '를'vector'에 복사하는 것을 피합니다. –

관련 문제