Zgaduję chcesz wprowadzić pewne algorytmy, które potrzebują dostępu do dowolnych tablica podobnych pojemników za pomocą indeksów w czasie kompilacji i w związku z tym zamierzają użyć jakiejś funkcji (np. std::get
), aby równomiernie wykonać to zadanie ?! W takim przypadku jest to ta sama działalność, co udostępnienie begin
i end
dla Twojej klasy. Po prostu zadeklaruj funkcję get
w przestrzeni nazw, w której zadeklarowałeś swoją klasę kontenera, i pozwól ADL wykonać swoje zadania.
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]; }
W swoim algorytmie po prostu użyć get
(bez prefiksu std
przestrzeni nazw) i ADL wezwie prawidłową funkcję. Tak więc standardowe konstrukcje, takie jak array
, tuple
i std::get
są wywoływane, a dla Twojego kontenera podana jest funkcja get
.
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
myślę 'std :: dostać (...)' jest naprawdę mają być stosowane tylko do 'std :: tuple' i że byłoby lepiej, aby zdefiniować własną funkcję dla twojej niestandardowej klasy. –