std::tuple<void> verboten?
-
Irgendwann sagt camper was falsches. Irgendwann. Wenn nicht morgen, dann vielleicht in zehn Jahren. Ich werde warten. Er ist auch nur ein Mensch.

Die Idee eines Tuples ist es, eine Liste von Typen kompakt zu speichern (EBO).
Das ist hingegen irgendwie die Idee von variadic templates' template parameter packs.
-
Nathan schrieb:
stuppie, was willste erreichen?
Memberfunktionen? Rückgabe?Willst du vielleicht variadic templates oder typelists?
Macht in diesem abstrakten Beispiel vielleicht wenig Sinn, aber ich hätte gerne so etwas:
template <typename T, typename Opt=void> struct klassemitoptionalemparameter { std::tuple<T, Opt> werte; Opt gibOptionalenWert() { return std::get<1>(werte); } };Da wäre
tuple<void>halt praktisch gewesen.
-
n3337 schrieb:
17.6.4.8/2
[...]In particular, the effects are undefined in the following cases:
— if an incomplete type (3.9) is used as a template argument when instantiating a template component, unless specifically allowed for that component.Eine entsprechende Ausnahme für tuple existiert nicht.
Genau genommen stimmt meine Aussage also nicht: Solange das tuple nicht instantiiert wird, kann void verwendet werden. Das dürfte allerdings kaum von irgendeinem Nutzen sein.
-
Sone schrieb:
Irgendwann sagt camper was falsches. Irgendwann. Wenn nicht morgen, dann vielleicht in zehn Jahren. Ich werde warten. Er ist auch nur ein Mensch.

Hättest mich im C Forum erwischen können (ok, das war eine halbe Unwahrheit).
-
camper schrieb:
n3337 schrieb:
17.6.4.28/2
[...]In particular, the effects are undefined in the following cases:
— if an incomplete type (3.9) is used as a template argument when instantiating a template component, unless specifically allowed for that component.Eine entsprechende Ausnahme für tuple existiert nicht.
Genau genommen stimmt meine Aussage also nicht: Solange das tuple nicht instantiiert wird, kann void verwendet werden. Das dürfte allerdings kaum von irgendeinem Nutzen sein.Dir ist eine 2 in die Paragraphenangabe gerutscht (17.6.4.8).
Wusste ich übrigens nicht - gut zu wissen
camper schrieb:
Sone schrieb:
Irgendwann sagt camper was falsches. Irgendwann. Wenn nicht morgen, dann vielleicht in zehn Jahren. Ich werde warten. Er ist auch nur ein Mensch.

Hättest mich im C Forum erwischen können (ok, das war eine halbe Unwahrheit).
Von C hab ich nun mal überhaupt keine Ahnung.

-
Sone, schäm dich!
-
Mal theoretisch betrachtet (Stichwort algebraischer Typ) repräsentiert ein Tupel einen Produkt-Typen. Und
voidist quasi der 0-Typ, weswegen das ganze Produkt 0 wäre.
Oder anders gesagt: da man kein Objekt von Typvoidanlegen kann, könnte man nie ein solches Tupel anlegen, weil man für denvoid-Teil nichts hätte. Tupel mitvoidmachen somit keinen Sinn, man könnte gleichvoidnehmen.stuppi schrieb:
abstrakten Beispiel vielleicht wenig Sinn, aber ich hätte gerne so etwas:
template <typename T, typename Opt=void> struct klassemitoptionalemparameter { std::tuple<T, Opt> werte; Opt gibOptionalenWert() { return std::get<1>(werte); } };Was du hier willst, ist ein Typ, der keine inheränten Informationen besitzt. Das ist algebraisch aber nicht der 0-Typ, sondern der 1-Typ, von dem es genau ein mögliches Objekt gibt (womit ich nichts gewonnen habe, wenn ich ein Objekt dieses Typen bekomme, ich weiß ja sowieso, welches es ist).
In C++ kann man einen solchen Typen repräsentieren durchstruct unit {};, oder auchstd::tuple<>.
Wenn wir uns nun erinnern, dass Tupel Produkttypen sind, haben wir bei einem Tupel mit einem solchen Typen als Element eine 1 im Produkt, die den Wert nicht ändert, das Tupel hat also noch genau denselben Informationsgehalt. Und dass wir keine zusätzlichen Informationen reinbekommen, ist genau das hier Gewünschte.
-
stuppi schrieb:
Gibt es eigentlich einen guten Grund, weshalb mir mein Compiler bei
std::tuple<int, void> t;mit einer über 80 Zeilen langen Fehlermeldung abschmiert?
Gibt es eigentlich einen Grund, warum man
tuple<int,void>benutzen wollen würde? Warum steht davoiddrin? Wozu soll das gut sein?stuppi schrieb:
Rein technisch müsste
tuple<void>doch machbar sein.Ich verstehe den Sinn nicht/was dabei rauskommen soll.
stuppi schrieb:
Semantisch hätte ich es gerade eben gebraucht um meiner Klasse einen optionalen Member zu spendieren;
Verwechselst du
tuple<int,void>mitboost::optional<int>?stuppi schrieb:
aber mich würden dennoch die Gründe gegen
tuple<void>interessieren.Warum hat ein Kreis eigentlich nicht endlich viele Ecken?
Kann man nicht auch einen Kreis mit endlich vielen Ecken bauen?
Sollte doch technisch machbar sein.
-
krümelkacker schrieb:
stuppi schrieb:
Rein technisch müsste
tuple<void>doch machbar sein.Ich verstehe den Sinn nicht/was dabei rauskommen soll.
Ich könnte mir vorstellen, daß man eine Datenstruktur baut, die tuple<A,B> nach A sortiert/gehasht verwaltet und drumherum zwei Wrapper, mit tuple<A,B> ist es eine map, mit tuple<A,void> nur eine set.
-
Ah, ok.
Statt void könnte man ja mal tuple_element<0,decltype(tie(ignore))>::type probieren.