2012-04-19 4 views
2

"How to properly use references with variadic templates"을보고 있었는데 쉼표 확장이 얼마나 멀리 갈 수 있는지 궁금했습니다.가변적 인 확장을 쉼표로 연산자 호출 체인으로 사용할 수 있습니까?

여기 답의 변형입니다 :

inline void inc() { } 

template<typename T,typename ...Args> 
inline void inc(T& t, Args& ...args) { ++t; inc(args...); } 

가변 인수가 요소의 쉼표으로 단락 지어진리스트로 확장되기 때문에, 그 쉼표 의미 템플릿/함수 인수 구분에 해당합니다, 또는 어휘로이 삽입되어 쉼표 연산자를 포함한 모든 (사후 전 처리기) 사용에 적합합니까?

이 내 GCC-4.6에서 작동 :

// Use the same zero-argument "inc" 

template<typename T,typename ...Args> 
inline void inc(T& t, Args& ...args) { ++t, inc(args...); } 

을하지만 시도 할 때 :

// Use the same zero-argument "inc" 

template<typename T,typename ...Args> 
inline void inc(T& t, Args& ...args) { ++t, ++args...; } 

내가 기대, 구문 분석 오류를 받고 보관 ";" "..."앞에 있고, "args"는 팩을 확장하지 않을 것입니다. 왜 작동하지 않습니까? "args"가 비어 있으면 잘못된 구두점을 얻을 수 있기 때문입니까? 그것은 합법적입니까, 제 컴파일러는 충분하지 않습니까?

(I는 "인수"괄호를 둘러싼 시도하지, 및/또는 후행 증가를 사용했습니다;. 둘 다 일)

+0

는 가변 인자 템플릿 매개 변수와 연산자 +를 정의 않았다 일부 operator++는 반환 형식 void을 가지고있을 때, 귀하의 경우 유용 할 수 있습니다? –

+0

가변 템플릿에 대한 위키 백과 문서를 참조하십시오. 언젠가 나는 기사에 그런 확장에 몇몇 기술을 추가했다. –

답변

3

포장 풀기는 특정 상황에서 허용되며, 쉼표 그들에게 속하지 않는 문을 분리 . 귀하의 단어 사용 : 확장은 의미 상으로 어휘 적으로는 아닙니다. 그러나 다른 여러 가지 방법이 있기 때문에 중요하지 않습니다. 간단한 variadic 함수를 작성하는 패턴/숙어가 이미 있습니다. 그 일을하는 한 가지 방법 :

는 도우미 템플릿 기능을 사용하여, 즉 아무 것도하지 않습니다 :

template <typename ...Args> 
void pass(Args&&...) { } 

대신 쉼표 연산자를 사용하여,이 함수로 표현을 전달합니다

template <typename ...Args> 
void inc(Args&&... args) 
{ 
    pass(++std::forward<Args>(args)...); 
} 

표현식이 더 복잡한 경우 확장 내에서 쉼표 연산자를 사용할 수 있습니다.

pass((++std::forward<Args>(args), 0)...); 
+1

이 대답은 잘못되었습니다 (즉, 위험합니다). 인수 평가의 순서는 정의되지 않으므로 부작용의 순서도 정의되지 않습니다. 패스워드 ({(something) ...})를'initializer_list'를 인수로 취하는'template void pass (T)'함수 여야합니다. http://stackoverflow.com/questions/621542/compilers-and-argument-order-of-evaluation-in-c –

+0

@ polkovnikov.ph : 음, 나는 그것을 _wrong_이라고 부르지 않을 것입니다. 부작용이있는 인수가있는 모든 함수 호출만큼 정확하거나 잘못되었습니다. 그러나 당신 말이 맞습니다. 정의 된 평가 순서가있는 대안이 있습니다. 그러나, 나는'std :: initializer_list'를 통해 가변 생성자를 가진 클래스의 _brace initialisation_을 추천 할 것이다. – nosid

관련 문제