내 프로젝트 열거 형 값에서 종종 로그 파일에 쓰거나 문자열로 유지해야합니다. 그래서, 다음 예에서와 같이 기능 ToString 및 StringToEnum를 제공 봤는데 : 내가 StringToEnum를 사용할 때 내가 쓰기 결국반환 유형에 따라 오버로드를 선택하는 방법
namespace Mine
{
enum class Color { red, green, blue };
inline std::wstring ToString(Color c)
{
switch (c)
{
case Color::red: return L"red";
case Color::green: return L"green";
case Color::blue: return L"blue";
default: THROW_MACRO("Unexpected value[{}] for enum[{}]", c, L"Color");
}
}
inline void StringToEnum(const std::wstring& inEnumValueName, Color& out)
{
if (inEnumValueName == L"red")
{
out = Color::red;
}
else if (inEnumValueName == L"green")
{
out = Color::green;
}
else if (inEnumValueName == L"blue")
{
out = Color::blue;
}
else
{
THROW_MACRO("Unexpected value[{}] for enum[{}]", inEnumValueName, L"Color");
}
}
}
:
Color c;
StrintToEnum(L"red", c);
// use c
난 정말 선언 할 수 있도록하고 싶습니다 및 한 줄에 초기화 및 쓰기 :
auto c = ToEnum<Mine::Color>(L"red);
내가 같이 ToEnum을 정의 헤더에 넣어 포함합니다 :
namespace CommonCode
{
template<class T>
T ToEnum(const std::wstring& enumValueName)
{
T value;
StringToEnum(enumValueName, value);
return value;
}
}
관련 StringToEnum 함수가 정의되지 않았기 때문에 ToEnum이 컴파일되지 않습니다.
코딩 할 수있는 유용한 방법이 있습니까? 또는 문자열에서 열거 형 값을 선언하고 초기화 할 때마다 두 줄의 코드를 작성해야 할 필요가 있습니까?
나는 ToEnum을 전문화하려고 시도했으나 열거 형을 정의하고있는 네임 스페이스를 닫고 CommonCode 네임 스페이스를 열고 추가 한 다음 원래 네임 스페이스로 다시 이동해야한다는 문제가있었습니다. 이것은 많은 타이핑이고 꽤보기 흉하게 보입니다.
(저는 Visual Studio 2015 Update 3을 사용하고 있으므로 컴파일 할 때 어떤 솔루션이든 선호 될 것입니다).
왜 'StringToEnum'을 참조로 전달하지 않고'Color'를 반환 할 수 없는지 잘 모르겠습니다. – TartanLlama
@TartanLlama 왜냐하면'Color' 만 가능하기 때문입니다. 다른 열거 형에 사용할 수 없습니다. –
왜 'StringToEnum'이 색상 자체를 반환 할 수 없는지 확실하지 않습니다. b) ToEnum 템플릿 전에 선언 할 수없는 이유. – SergeyA