C++ không có cách nào để lấy biểu diễn chuỗi của một enum. Người làm được việc này bằng cách viết các chức năng tùy chỉnh có chứa rất nhiều mã boilerplate aka
switch
với case XYZ return "XYZ";
Là ghi đè std :: to_string cho người dùng xác định enums cách thích hợp để cung cấp to_string cho người dùng xác định enums?
Điều đó tất nhiên đòi hỏi người sử dụng enum để biết tên của các chức năng tùy chỉnh.
Vì vậy, tôi nghĩ rằng tôi chỉ có thể thêm chuyên môn vào std::to_string
để cho phép người dùng sử dụng to_string
trên enums của tôi. Một cái gì đó như thế này:
//
#include <iostream>
#include <string>
#include <cassert>
#define TEST
class Car
{
public:
enum class Color
{
Red,
Blue,
White
};
};
#ifdef TEST
#include <string>
namespace std
{
std::string to_string (Car::Color c)
{
switch (c)
{
case Car::Color::Red:
return "Red";
case Car::Color::Blue:
return "Blue";
case Car::Color::White:
return "White";
default:
{
assert(0);
return "";
}
}
}
}
#endif
int main()
{
std::cout << std::to_string(Car::Color::White) << std::endl;
}
Có vấn đề gì với giải pháp này không?
Tôi không cho phép chức năng std quá tải được phép, chỉ có các mẫu chuyên biệt. – chris
Hai điều: Tôi sẽ kiểm tra việc sử dụng '#define str (x) # x' (và kết hợp' #define glue (a, b) a ## b') để xem có phù hợp với nhu cầu của bạn với ít bản mẫu không . Chỉ cần chắc chắn để bọc nó trong một chức năng cho an toàn loại, và để '# undef' nó ngay sau khi bạn đã hoàn tất. Thứ hai, và ít quan trọng hơn, là bạn đã quên 'break;' s trong switch của bạn - có thể đưa ra một lý do không sử dụng nó nếu bạn không cảm thấy siêu đơn vị testy. – FizzixNerd