2015-10-02 7 views
6

std::tuple to bestia ładowana szablonami. Aby uzyskać dostęp do n-tego kompilatora, członek musi wykonać wiele instancji szablonu, chociaż jego prosta natura: dostęp do n-tego członka danych odpowiadającej wyimaginowanej strukturze. Wydaje się, że std::tuple powinna być cechą języka rdzeń, coś jak to (Pseudokod):Agregaty Variadic jako funkcja języka podstawowego

template< typename ...types > 
struct/* or class, or even union */ V 
{ 
    types... V; // defines implicitly `operator [/*constant expression*/]` to access by index 
    // if more than one variadic parameter pack provided 
    // (during expanding of parameter pack of template 
    // parameters in specializations) then instead of 
    // `V` there can be specific data-member name (say, `x`), 
    // but still with `x.operator []` implicitly defined 

    // member functions and data members allowed 
}; 

template< typename ...types > 
V< std::decay_t<types>... > make_tuple(types &&... args) 
{ return {std::forward<types>(args)...}; } 
template< typename ...types > 
V< types &&... > forward_as_tuple(types &&... args) 
{ return {std::forward<types>(args)...}; } 
template< typename ...types > 
V< types &... > tie(types &... args) 
{ return {args...}; } 

Czy istnieje jakakolwiek propozycja czegoś podobnego języka obsługiwane danych o zmiennej liczbie argumentów członów definicji składni dla klas?

+1

Jaką korzyść ma ta funkcja języka rdzennego? dlaczego tylko 'std :: tuple'? dlaczego nie "std :: vector" również? Uważam, że jeśli coś można zrobić jako funkcję biblioteki, należy to zrobić, * tylko jeśli * to nie jest możliwe (lub zbyt hakerstwo, aby to zrobić) ma sens dodanie funkcji języka. – Nawaz

+0

@Nawaz POD tablica (pojedynczy typ, wiele wartości) już obecne w języku, 'int x [3] = {1, 2, 3};'. – Orient

+1

Bez względu na "typy ... V;', 'operator [] (size_t)' nie może istnieć. – Barry

Odpowiedz

9

Aby uzyskać podobny pomysł, zobacz N4235 Selecting from Parameter Packs.

Może to być przydatne dla std::tuple, ale bardziej interesuje mnie funkcja upraszczająca jej konstrukcję, a nie wybór członków (co jest stosunkowo proste).

Definicja std::tuple jest niezwykle skomplikowana, aby wszyscy konstruktorzy poprawnie modelowali właściwości wszystkich członków (patrz N4064 dla najnowszych zmian w tym obszarze).

Podczas korzystania z agregacji-inicjalizacji kompilator automatycznie sprawdza, czy każdy element agregatu może zostać skonstruowany z odpowiednich inicjalizatorów. Sprawdza odpowiednich konstruktorów, czy są one explicit, przyjąć odpowiednią kategorię lwartość/rvalue itp

Podczas definiowania konstruktora dla std::tuple to musi być bardzo skomplikowane, aby upewnić się, że tylko prawidłowe konwersje zdarzyć, że konstruktorzy nie są explicit używane, gdy nie powinny być itp.

Chciałbym funkcji, która znacznie ułatwiła automatyczne generowanie odpowiednich konstruktorów w celu modelowania tej samej semantyki, jaką otrzymujesz za darmo z inicjowania agregacji.

+4

To to fajna propozycja! – Barry

+1

I nawet nie weszliśmy w implementację wariantu literalnego typu variantic 'variant ';) –

+0

@LucDanton, tak, nie poruszam tego tematu za pomocą słupka 10 '! :) –