Ich versuche, eine Funktion zu schreiben, die eine Teilmenge eines variadic Argument-Pakets in Form einer std::tuple
zurückgibt. Die Funktion sollte idealerweise keinen Laufzeit-Overhead haben (keine unnötigen Kopien), und es sollte Benutzern ermöglichen, auf lvalue
Referenzen zuzugreifen und sie zu modifizieren.Entfernen Sie Rvalueness, behalten Lvalue Referenzen (Standard-Typ Merkmal verfügbar?)
Werttypen, lvalue
Referenzen und const lvalue
Referenzen sollten beibehalten werden. Provisionen (rvalue
Verweise) sollten in Werttypen "konvertiert" werden, um zu vermeiden, dass ungültige Verweise (Verweise auf Provisorien) erstellt werden.
Beispiel für die gewünschten Ergebnisse:
int lr = 5;
const int& clr = lr;
auto t = make_subpack_tuple(lr, clr, 5);
static_assert(is_same
<
decltype(t),
std::tuple<int&, const int&, int>
>{}, "");
// Ok, modifies lr:
std::get<0>(t) = 10;
// Compile-time error, intended:
// std::get<1>(t) = 20;
// Ok, 5 was moved into the tuple:
std::get<2>(t) = 30;
Beispiel unvollständige Umsetzung:
template<typename... Ts>
auto make_subpack_tuple(Ts&&... xs)
{
return std::tuple
<
some_type_trait<decltype(xs)>...
>
(
std::forward<decltype(xs)>(xs)...
);
}
Macht das, was ich versuche, Sinn machen?
Gibt es ein Standard-Typenmerkmal, das anstelle von some_type_trait
verwendet werden kann? Oder sollte ich meine eigene Lösung implementieren?
nur bin ich neugierig. Warum interessiert dich das? Welches Problem lösen Sie? –
Ich implementiere etwas ähnlich wie ein 'static_for', das ein Callable Object über heterogene Werte mit einer benutzerdefinierten Arity ausführt, und erlaubt dem Benutzer die aktuelle Iterationsnummer zur Kompilierzeit abzurufen und zu brechen/fortzusetzen * (früher beenden) * zur Kompilierzeit mit 'static_if'. Ein Teil der Implementierung erfordert das Übergeben der ersten "N" Argumente des variadischen Argumentpakets an eine andere innere Funktion, und ich habe versucht, dies zu verallgemeinern, indem ich einige variadische Argumentpaketmanipulationsfunktionen definiert habe. Anders als 'nth ' benötige ich 'subpack ', um dieses Verhalten vollständig zu verallgemeinern. –
Durch user-spezifizierte Arity, meine ich, dass das 'static_for' über die heterogenen Werte in Gruppen von' N' iteriert (wobei 'N' ist) Vorlagenparameter vom Benutzer angegeben). Das aufrufbare Objekt, das den Körper des 'static_for' darstellt, muss einen' operator() 'mit der gleichen Arity haben. Außerdem mache ich das alles für eine Open-Source-C++ 14-Universalbibliothek ([vrm_core] (https://github.com/SuperV1234/vrm_core)), die aus Spaß und zu Lernzwecken geschrieben wurde. Hoffe das beantwortet deine Frage :) –