Ich vermute, Sie einige Algorithmen implementieren mögen, die Compiler-Indizes mit Zugriff auf beliebige Array-artigen Behälter müssen und dafür, eine Funktion (wie std::get
) zu verwenden, um diese Aufgabe gleichmäßig durchzuführen ?! In diesem Fall ist es das gleiche Geschäft wie begin
und end
für Ihre Klasse verfügbar. Sie deklarieren einfach eine Funktion get
in dem Namespace, in dem Sie Ihre Containerklasse deklarierten, und lassen Sie ADL seine Aufgaben ausführen.
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]; }
In Ihrem Algorithmus nur Sie verwenden get
(ohne std
Namespacepräfix) und ADL wird die richtige Funktion aufrufen. Also, für die Standard-Strukturen wie array
, tuple
und pair
std::get
wird aufgerufen und für Ihren Container die get
Funktion, die Sie zur Verfügung gestellt.
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
Ich denke 'std :: get (...)' wirklich nur angewendet werden soll 'std :: tuple' und dass es besser wäre, eine eigene Funktion zu definieren, für Ihre benutzerdefinierte Klasse. –