std::variant und Template Parameter
-
Hallo
Bin etwas am experimentieren.
Habe mir eine struct erstellt die unter anderem einen std:variant enthält.
struct IoVariable { using ioValue = std::variant<float, double, int>; struct Category { enum index : std::size_t { Float, Double, Int }; }; std::string Description; std::string Name; ioValue Value; std::string Unit; template <typename Tvalue> Tvalue GetValue() { return std::get<Tvalue>(Value); } };
die GetValue() funktion soll nun einfach eine Wrapper um das std::get sein.
damit ich bei einer Instanz der Klasse nicht immer das std::get schreiben muss wenn ich auf den Wert zugreifen will.Aber wie kann ich den nun den Template Parameter Tvalue beschränken auf die Datentypen die im std::variant definiert sind.
Über die Struct Category hatte ich auch mal versucht einzugrenzen.
template <Category::index index> decltype(std::get<index>(Value)) GetValue() { return std::get<index>(Value); }
was funktioniert. Allerdings ist dann der Aufruf so lang:
IoVariable instance; instance.GetValue<IoVariable::Category::index::Double>();
Habt ihr ne bessere Idee?
-
static_assert mit std::is_same?
-
@caligulaminus sagte in std::variant und Template Parameter:
static_assert mit std::is_same?
so in etwa
static_assert(std::is_same<Tvalue, ?? )>::value, "Tvalue must be type of ... ");
aber weiß nicht was ich für ?? einsetzen muss.
-
Na, Du brauchst drei veroderte std::is_same (oder kürzer std::is_same_t) für deine drei Typen.
-
Mittels einfacher Oder-Verknüpfung:
static_assert(std::is_same<Tvalue, double>::value || std::is_same<Tvalue, float>::value || std::is_same<Tvalue, int>::value, "Tvalue must be of type double, float or int");
-
@th69 sagte in std::variant und Template Parameter:
static_assert(std::is_same<Tvalue, double>::value ||
std::is_same<Tvalue, float>::value ||
std::is_same<Tvalue, int>::value,
"Tvalue must be of type double, float or int");ok, schade dachte ich kann da irgendwie die template argumente aus dem std::variant erfragen.
-
@booster sagte in std::variant und Template Parameter:
Aber wie kann ich den nun den Template Parameter Tvalue beschränken auf die Datentypen die im std::variant definiert sind.
std::get lässt nichts anderes zu. Wo ist das Problem?
-
@manni66 sagte in std::variant und Template Parameter:
std::get lässt nichts anderes zu. Wo ist das Problem?
Das Problem ist das du recht hast
Danke dir!