Vraag Verlichtend gebruik van C ++ 11 decltype


Ik heb net gezien dit is echt een leuk gesprek  Rock Hard: C ++ Evolving door Boris Jabes. In het gedeelte van het gesprek over Generieke programmering van de hogere orde hij zegt dat het volgende een voorbeeld is van een functie die generieker is met betrekking tot het retourneringstype en leidt tot minder sjabloonfunctieoverbelastingen

template <typename Func>
auto deduce(const Func & f) -> decltype(f())
{..}

Dit kan echter als volgt worden gerealiseerd met behulp van syntaxis van platte sjablonen

template <typename Func>
Func deduce(const Func & f)
{..}

dus ik denk dat het gekozen voorbeeld dat niet doet werkelijk toon de unieke kracht van decltype. Kan iemand daar een voorbeeld van geven? verhelderend gebruik van decltype?


11
2017-10-01 23:00


oorsprong


antwoorden:


Je vermoedens zijn onjuist.

void f() { }

Nu deduce(&f) heeft type void, maar met je herschrijving heeft het type void(*)(). In elk geval, overal waar je het type expressie of verklaring wilt krijgen, gebruik je decltype (let op het subtiele verschil tussen deze twee. decltype(x) is niet noodzakelijk hetzelfde als decltype((x))).

Het is bijvoorbeeld waarschijnlijk dat je standaardbibliotheekimplementatie ergens regels als bevat

using size_t = decltype(sizeof(0));
using ptrdiff_t = decltype((int*)0 - (int*)0);
using nullptr_t = decltype(nullptr);

Het juiste retourtype vinden van add is in de afgelopen C ++ een uitdagend probleem geweest. Dit is nu een eenvoudige oefening.

template<typename A, typename B> 
auto add(A const& a, B const& b) -> decltype(a + b) { return a + b; }

Weinig bekend is dat je kunt gebruiken decltype voor :: en in een pseudo destructor naam

// has no effect
(0).~decltype(0)();

// it and ite will be iterators into an initializer list 
auto x = { 1, 2, 3 };
decltype(x)::iterator it = x.begin(), ite = x.end();

25
2017-10-01 23:07



std::for_each(c.begin(), c.end(), [](decltype (c.front()) val){val*=2;});

Het value_type van de container automatisch coderen c kan niet zonder worden gedaan decltype.


1
2017-10-01 23:06



Eén plaats die ik gebruik, is waar ik een variabele moet maken die hetzelfde type van een andere variabele moet hebben. maar ik weet niet zeker of het type in de toekomst hetzelfde zal blijven of niet.

void foo(int a)//maybe in future type of a changed
{
    decltype(a) b;
    //do something with b
}

0
2018-06-08 19:26