“……”토큰의 의미는 무엇입니까? 즉, 매개 변수 팩의 이중 줄임표 연산자
gcc의 현재 새로운 C ++ 11 헤더 구현을 탐색하면서 "......"토큰을 발견했습니다. 다음 코드가 [ideone.com을 통해] 잘 컴파일 되는지 확인할 수 있습니다 .
template <typename T>
struct X
{ /* ... */ };
template <typename T, typename ... U>
struct X<T(U......)> // this line is the important one
{ /* ... */ };
이 토큰의 의미는 무엇입니까?
편집 : 질문 제목에 "......"이 "..."로 잘린 것처럼 보입니다. 실제로 "......"을 의미했습니다. :)
그 기이의 모든 인스턴스는 규칙적인 단일 줄임표의 경우와 쌍을 이룹니다.
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..., ...
. 즉, variadic 템플릿 확장 다음에 C 스타일 varargs 목록 이옵니다.
이론을 뒷받침 하는 테스트 가 있습니다. 최악의 의사 조작자에게는 새로운 승자가 있다고 생각합니다.
편집 : 이것은 적합 한 것으로 보입니다. §8.3.5 / 3는 매개 변수 목록을 구성하는 한 가지 방법을 설명합니다.
매개 변수 선언 목록 opt ... opt
따라서 이중 줄임표는 매개 변수 팩으로 끝나는 매개 변수 선언 목록과 다른 줄임표로 구성됩니다.
쉼표는 전적으로 선택 사항입니다. §8.3.5 / 4는 말합니다
구문 적으로 정확하고 "..."이 추상 선언의 일부가 아닌 경우 ", ..."은 "..."과 동의어입니다.
이것은 이다 , 추상적 - 선언자 내에서 [편집] 하지만, 요하네스은 매개 변수 선언 내에서 추상 선언자 언급하는 것이 좋은 지적을합니다. 왜 그들이 "파라미터 선언의 일부"라고 말하지 않았고 왜 그 문장이 유익한 메모가 아닌지 궁금합니다.
또한 varargs 목록 앞에 매개 변수 va_begin()
가 <cstdarg>
필요하므로 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 );
}
vs2015에서는 템플릿 버전에서 쉼표를 구분해야합니다.
template <typename T, typename ... U>
struct X<T(U...,...)> {};// this line is the important one
인스턴스화의 예는 다음과 같습니다.
X<int(int...)> my_va_func;
안부, FM.
'program tip' 카테고리의 다른 글
git 저장소를 데이터베이스 백엔드로 사용 (0) | 2020.08.02 |
---|---|
Java 웹 애플리케이션이 .do 확장자를 사용하는 이유는 무엇입니까? (0) | 2020.08.02 |
Android의 키오스크 모드 (0) | 2020.08.02 |
“_”(밑줄)이“-”(하이픈)과 일치하는 이유는 무엇입니까? (0) | 2020.07.30 |
패치를 적용 할 때 충돌을 해결할 수있는 방법이 있습니까? (0) | 2020.07.30 |