program tip

“……”토큰의 의미는 무엇입니까?

radiobox 2020. 8. 2. 18:03
반응형

“……”토큰의 의미는 무엇입니까? 즉, 매개 변수 팩의 이중 줄임표 연산자


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.

참고 URL : https://stackoverflow.com/questions/5625600/what-is-the-meaning-of-token-ie-double-ellipsis-operator-on-paramet

반응형