c++ 可以在std::cin中将std::string转换为枚举类吗?

klh5stk1  于 2023-08-09  发布在  其他
关注(0)|答案(1)|浏览(119)

我是新来的。假设我们有一个如下的类:

class Animal {
    public:
        enum class Group {mammal, bird, reptile};
    private:    
        Group group;
}

字符串
现在我想用这种方式初始化它:

Animal::Group g;
std::cin >> g;
std::unique_ptr<Animal> dog = std::make_unique<Animal>(std::move(g));


我尝试重载istream如下,并使其成为class Animal的朋友,但它不工作。

auto string_to_vlt(std::string const s) -> std::optional<Human::Violation>
{
    if (s == "mammal")     return Animal::Group::mammal;
    if (s == "bird")       return Animal::Group::bird;
    if (s == "reptile")    return Animal::Group::reptile;
    return std::nullopt;
}

auto operator>>(std::istream& is, Animal::Group v) -> std::istream& // friend function
{
    auto s = std::string();
    if (!(is >> s)) {
        return is;
    }
    if (auto result = string_to_vlt(s)) {
        v = *result;
    }
    return is;
}


有什么想法吗?有可能吗?

but5z9lq

but5z9lq1#

有一个很酷的库可以解决这个问题Magic Enum
它可以使代码工作,而无需大量的编码:

#include <iostream>
#include <memory>
#include <magic_enum.hpp>
#include <magic_enum_iostream.hpp>

using namespace magic_enum::ostream_operators; 
using namespace magic_enum::istream_operators; 

class Animal {
public:
    enum class Group {
        mammal,
        bird,
        reptile,
    };

    explicit Animal(Group g) : group { g } { 
        std::cout << "making: " << group << '\n';
    }

    ~Animal()
    {
        std::cout << "removing: " << group << '\n';
    }

private:
    Group group;
};

int main()
{
    Animal::Group g;
    while (std::cin >> g) {
        auto dog = std::make_unique<Animal>(g);
    }
    return 0;
}

字符串
https://godbolt.org/z/ae7nbvbEq
免责声明:请注意,此库利用了一些编译器特定的功能,因此不能保证它总是工作。参见限制。

相关问题