Sto indovinando si desidera implementare alcuni algoritmi che devono accedere a arbitrari array come contenitori utilizzando indici in fase di compilazione e quindi mirare a utilizzare alcune funzioni (come std::get
) per eseguire in modo uniforme tale attività ?! In questo caso, è lo stesso business di rendere begin
e end
disponibili per la classe. Basta dichiarare una funzione get
nello spazio dei nomi in cui è stata dichiarata la propria classe contenitore e lasciare che ADL faccia il proprio lavoro.
template <unsigned I, unsigned N>
MyClass& get (MyContainer<N>& c) { return c.array[I]; }
template <unsigned I, unsigned N>
MyClass const& get (MyContainer<N> const& c) { return c.array[I]; }
Nel vostro algoritmo è sufficiente utilizzare get
(senza il prefisso std
namespace) e ADL chiamerà la funzione corretta. Quindi, per le strutture standard come array
, tuple
e pair
std::get
viene invocato e per il contenitore la funzione get
che hai fornito.
int main(){
std::array<int, 3> a {{0,1,2}};
auto t = std::make_tuple(0.0, 1.0f, 2);
auto p = std::make_pair('0', 4.4);
MyContainer<3> c;
std::cout << get<1>(a) << std::endl;
std::cout << get<1>(t) << std::endl;
std::cout << get<1>(p) << std::endl;
std::cout << get<1>(c).a << std::endl;
return 0;
}
Example
fonte
2013-04-24 08:30:42
penso 'std :: get (...)' è veramente destinato ad essere applicato solo a 'std :: tuple' e che sarebbe meglio definire la propria funzione per la tua classe personalizzata. –