SORU
22 NİSAN 2010, PERŞEMBE


Std arasındaki fark::result_of ve decltype

Bazı sorunlar C 0 x std::result_of gerek anlayış var. Eğer doğru anladıysam, result_of bir işlevi çağırarak elde edilen tür elde etmek için kullanılan parametreler belirli türde bir nesne. Örneğin:

template <typename F, typename Arg>
typename std::result_of<F(Arg)>::type
invoke(F f, Arg a)
{
    return f(a);
}

Gerçekten aşağıdaki kodu fark göremiyorum:

template <typename F, typename Arg>
auto invoke(F f, Arg a) -> decltype(f(a)) //uses the f parameter
{
    return f(a);
}

ya

template <typename F, typename Arg>
auto invoke(F f, Arg a) -> decltype(F()(a)); //"constructs" an F
{
    return f(a);
}

Bu iki çözüm ile görebildiğim tek sorun da gerekiyor

  • ifade decltype geçirilen kullanmak eşleme örneği var.
  • eşleme için tanımlanmış bir kurucu olduğunu.

İkincisi ise yok decltype result_of arasındaki tek fark, ilkinde bir ifade ihtiyacı olduğunu düşünmekte haklı mıyım?

CEVAP
22 NİSAN 2010, PERŞEMBE


result_of ** 17 included in TR1 ve son olarak C 0 x oldu. Bu nedenle result_of geriye dönük uyumlu (uygun bir kütüphane ile) bir avantaja sahiptir.

decltype 0 x, sadece bir işlevin dönüş türü için kısıtlamaz C tamamen yeni bir şey ve bir dil özelliğidir.


Neyse, gcc 4.5, result_of decltype açısından uygulanır:

  template<typename _Signature>
    class result_of;

  template<typename _Functor, typename... _ArgTypes>
    struct result_of<_Functor(_ArgTypes...)>
    {
      typedef
        decltype( std::declval<_Functor>()(std::declval<_ArgTypes>()...) )
        type;
    };

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bigapplemagic

    Bigapplemagi

    22 EYLÜL 2011
  • DroidModderX ROOT Master

    DroidModderX

    14 ŞUBAT 2011
  • TechRax

    TechRax

    21 EYLÜL 2009