【问题标题】:define a function to return specified type of std::variant c++定义一个函数以返回指定类型的 std::variant c++
【发布时间】:2020-12-21 10:14:49
【问题描述】:

我几乎是使用 c++17 规则的新手。我的问题很简单;如何以我定义它们的相同顺序访问 std::variant 类型?我知道下面的代码不起作用!

#include <variant>
#include <iostream>

using myVariant = std::variant<double, int, std::string>;

template<typename T>
T   typeReturn(int i);

int main(void)
{
    myVariant b = 1.2;

    double c = typeReturn(1)(b);

    std::cout << c << std::endl;

    return 0;
}

template<typename T>
T typeReturn(int i)
{
    if (i == 0) return std::get<double>;
    else if (i == 1) return std::get<int>;
    else if (i == 2) return std::get<std::string>;
    else return std::get<int>;
}

【问题讨论】:

  • typeReturn(1)(b); -> std::get&lt;1&gt;(b);。该函数已经存在,它是std::get。编号从 0 开始。
  • @KamilCuk 这正是我想要的。谢谢
  • @KamilCuk 可能值得回答,或者至少我不能很快找到这个的副本。
  • 顺便说一句,std::visit 是要走的路:std::visit([](const auto&amp; e){ std::cout &lt;&lt; e &lt;&lt; std::endl; }, c);

标签: c++ c++17 variant std-variant


【解决方案1】:

如何按照我定义它们的顺序访问 std::variant 类型?

无需自己编写 - std::get already does that。只是:

double c = std::get<0>(b);

【讨论】:

    【解决方案2】:

    不确定,但我想您正在寻找以下内容

    #include <variant>
    #include <iostream>
    
    using myVariant = std::variant<double, int, std::string>;
    
    template <std::size_t I>
    auto typeReturn (myVariant const & v)
     {
            if constexpr ( I == 0 ) return std::get<double>(v);
       else if constexpr ( I == 1 ) return std::get<int>(v);
       else if constexpr ( I == 2 ) return std::get<std::string>(v);
       else                         return std::get<int>(v);
    }
    
    int main ()
     {
       myVariant b = 1.2;
    
       double c = typeReturn<0u>(b);
    
       std::cout << c << std::endl;
     }
    

    注意你需要使用if constexpr并将索引作为模板参数传递。

    【讨论】:

    • 但是他们也根本不需要编写这个函数,因为它已经作为std::get&lt;&gt;()存在。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-13
    • 2015-03-23
    • 2013-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多