그 이상 함의 모든 인스턴스는 일반 단일 줄임표의 경우와 쌍을 이룹니다.
template<typename _Res, typename... _ArgTypes>
struct _Weak_result_type_impl<_Res(_ArgTypes...)>
{ typedef _Res result_type; };
template<typename _Res, typename... _ArgTypes>
struct _Weak_result_type_impl<_Res(_ArgTypes......)>
{ typedef _Res result_type; };
template<typename _Res, typename... _ArgTypes>
struct _Weak_result_type_impl<_Res(_ArgTypes...) const>
{ typedef _Res result_type; };
template<typename _Res, typename... _ArgTypes>
struct _Weak_result_type_impl<_Res(_ArgTypes......) const>
{ typedef _Res result_type; };
내 생각에 이중 줄임표는 의미가 비슷하다는 것입니다 _ArgTypes..., ...
. 즉, 가변 템플릿 확장에 이어 C 스타일의 varargs 목록이 이어집니다.
여기에 그 이론을 뒷받침 하는 테스트 가 있습니다 ... 저는 우리가 사상 최악의 의사 연산자로 새로운 승자가 있다고 생각합니다.
편집 : 이것은 준수하는 것으로 보입니다. §8.3.5 / 3에서는 매개 변수 목록을 구성하는 한 가지 방법을 다음과 같이 설명합니다.
매개 변수 선언 목록 opt ... opt
따라서 이중 줄임표는 매개 변수 팩으로 끝나는 매개 변수 선언 목록과 다른 줄임표로 구성됩니다.
쉼표는 순전히 선택 사항입니다. §8.3.5 / 4는
구문이 정확하고 "..."가 추상 선언자의 일부가 아닌 경우 ", ..."는 "..."와 동의어입니다.
이것은 이다 , 추상적 - 선언자 내에서 [편집] 하지만, 요하네스은 매개 변수 선언 내에서 추상 선언자 언급하는 것이 좋은 지적을합니다. 왜 그들이 "파라미터 선언의 일부"라고 말하지 않았는지, 왜 그 문장이 단지 유익한 메모가 아닌지 궁금합니다…
또한 va_begin()
in <cstdarg>
은 varargs 목록 앞에 매개 변수 가 필요하므로 f(...)
C ++에서 특별히 허용 하는 프로토 타입 은 쓸모가 없습니다. C99와의 상호 참조는 일반 C에서는 불법입니다. 그래서 이것은 가장 기괴합니다.
사용법 참고
요청에 따라 다음은 이중 줄임표 의 데모 입니다.
#include <cstdio>
#include <string>
template< typename T >
T const &printf_helper( T const &x )
{ return x; }
char const *printf_helper( std::string const &x )
{ return x.c_str(); }
template< typename ... Req, typename ... Given >
int wrap_printf( int (*fn)( Req... ... ), Given ... args ) {
return fn( printf_helper( args ) ... );
}
int main() {
wrap_printf( &std::printf, "Hello %s\n", std::string( "world!" ) );
wrap_printf( &std::fprintf, stderr, std::string( "Error %d" ), 5 );
}
...
뒤에...
.