SORU
11 NİSAN 2011, PAZARTESİ


&Quot anlamı nedir;... ..." token? yani parametre paketi üzerinde çift üç nokta operatörü

C 11 yeni başlıkları gcc mevcut uygulama gezinirken, rastladım "......" token. Aşağıdaki kodu kontrol edebilirsiniz compiles fine [ideone.com üzerinden].

template <typename T>
struct X
{ /* ... */ };

template <typename T, typename ... U>
struct X<T(U......)> // this line is the important one
{ /* ... */ };

Bu işaretin anlamı nedir?

edit: ÇOK kesilmiş gibi Görünüyor"......" soru başlığında "...", yani ben, gerçekten"......" için . :)

CEVAP
11 NİSAN 2011, PAZARTESİ


Bu gariplik her örneği tek kişilik düzenli bir üç nokta bir dava ile eşleştirilmiş.

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

Benim tahminim çift üç nokta _ArgTypes..., ..., yani variadic bir şablon genişletme C-stil varargs bir liste takip anlamında benzer.

Here's a test bu teoriyi destekleyen yeni bir kazanan sözde operatör için daha kötü bence.

Düzenleme:Bu uyumlu gibi görünüyor. Madde 8.3.5/3 parametre listesi olarak form için bir yol açıklar

parametre bildirim listesiopt...opt

Çift üç nokta parametre paketi, başka bir üç nokta tarafından izlenen bildirimi parametre-listesi bir son ile oluşur.

Tamamen isteğe bağlıdır virgül; §/4 8.3.5 diyor

Sözdizimsel olarak doğru ve nereden nereye “...” soyut-Bildiricisi bir parçası değil, “, ...” ile eş anlamlıdır “...”.

Busoyut-Bildiricisi, bir içinde[Düzenle]ama Johannes içinde soyut-Bildiricisi bir parametre bildirimi başvuruyorsunuz bu iyi bir nokta yapar. "Parametre bildirimi bir parçası" ve bu cümle neden sadece bilgilendirici bir not değil.. demediler neden acaba

Ayrıca, va_begin() <cstdarg> varargs listesi önce bir parametre gerektirir, prototip f(...) özellikle C tarafından izin verilen bir işe yaramaz. Çapraz başvuru C99, düz yasadışı C. Yani, bu çok garip.

Kullanım not

İstek, here is a demonstration üç nokta iki:

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

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Matthew Smith

    Matthew Smit

    24 Mayıs 2010
  • StalkerJS

    StalkerJS

    15 HAZİRAN 2010
  • Vicious Computers

    Vicious Comp

    14 EKİM 2006