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!


Log in to reply