2016-11-30 3 views
3

In this Beispiel auf CPPR:Leere Klammern um std :: make_index_sequence

template<typename Array, std::size_t... I> 
decltype(auto) a2t_impl(const Array& a, std::index_sequence<I...>) 
{ 
    return std::make_tuple(a[I]...); 
} 

template<typename T, std::size_t N, typename Indices = std::make_index_sequence<N>> 
decltype(auto) a2t(const std::array<T, N>& a) 
{ 
    return a2t_impl(a, Indices()); 
} 

template<typename Func, typename Tup, std::size_t... index> 
decltype(auto) invoke_helper(Func&& func, Tup&& tup, std::index_sequence<index...>) 
{ 
    return func(std::get<index>(std::forward<Tup>(tup))...); 
} 

template<typename Func, typename Tup> 
decltype(auto) invoke(Func&& func, Tup&& tup) 
{ 
    constexpr auto Size = std::tuple_size<typename std::decay<Tup>::type>::value; 
    return invoke_helper(std::forward<Func>(func), 
         std::forward<Tup>(tup), 
         std::make_index_sequence<Size>{}); 
} 

gibt es diese Zeilen, die mir viel zu verwirren:

std::make_index_sequence<N> 
std::make_index_sequence<Size>{} 

Warum sind die geschweiften Klammern am Ende hinzugefügt manchmal (und das Weglassen von ihnen verursacht einen Kompilierungsfehler) und warum sind sie manchmal nicht?

template<std::size_t N> 
using make_index_sequence = make_integer_sequence<std::size_t, N>; 

std::make_integer_sequence ist ideal definiert als:

template<class T, T N> 
using make_integer_sequence = std::integer_sequence<T, /* a sequence 0, 1, 2, ..., N-1 */ >; 

Und std::integer_sequence ist eine Art von utility Header:

template< class T, T... Ints > 
class integer_sequence; 

Daher können Sie,

+2

Die geschweiften Klammern werden verwendet, um ein Objekt dieses Typs zu erstellen – Brian

+0

Sind Sie sicher, dass dies ein C++ 11-Code und nicht C++ 14 ist? Standard macht wirklich einen Unterschied :) –

+1

@ W.F. Das ist definitiv C++ 14. Ich bearbeite die Frage. Guter Fang. – skypjack

Antwort

3

Die erste Instanz (std::make_index_sequence<N>) wird in einer Vorlagenargumentliste verwendet. Es wird nur gesagt, dass der Vorlagentyp-Parameter Indices standardmäßig den Typ std::make_index_sequence<N> hat. Dort werden keine Instanzen von irgendetwas erstellt, die Verwendung ist deklarativ.

Die zweite Instanz (std::make_index_sequence<Size>{}) erstellt eine standardmäßige konstruierte Instanz dieses Typs. Die {} sind die neue C++ - Syntax für die Initialisierung. Wenn die Klammern leer sind, wird das Objekt standardmäßig konstruiert.

3

std::make_index_sequence ideal definiert ist als Verwenden Sie es wie jeder andere Typ und Rufen Sie seinen Standardkonstruktor auf, der überhaupt nicht seltsam ist.

Weitere Informationen finden Sie unter here.

Verwandte Themen