Я уже видел этот ответ раньше, но использовал карту или векторы, но я не могу использовать внешние библиотеки для своего проекта, поэтому мне нужно найти другой способ. Для преобразования в cstring я использую функцию со случаем переключения, и она работает, но для преобразования cstring в перечисление не идет, как планировалось.
Метод, который я придумал для преобразования cstring в enum, заключается в том, чтобы сначала привести enum к int (none, first, second и т. Д. Становится 0, 1, 2 и т. Д.), Чтобы я Можно использовать цикл for для перебора различных перечислений. Затем, используя функцию enum to cstring, я сравниваю передаваемую строку со строкой, заданной функцией преобразования. Если они равны, перечисление установлено. Это кажется довольно запутанным способом сделать это, и неудивительно, что я не могу заставить его работать.
Вот весь мой тестовый код, функция setType - это то, где что-то идет не так.
enum type { none, first, second, third, fourth };
const char* typeName(type name);
type setType(char* name); // trouble here
int myStrComp(const char *str1, const char *str2); // compare cstrings
int main() { // test the function
char testName[] = "second";
type testType = setType(testName);
std::cout << typeName(testType) << std::endl; // should print "second"
}
const char* typeName(type name) { // convert enum to cstring
switch (name) {
case none: return '\0'; break;
case first: return "first"; break;
case second: return "second"; break;
case third: return "third"; break;
case fourth: return "fourth"; break;
}
}
type setType(char* name) {
type temp;
for (int i = 0; i < 4; i++) { // I know, inefficient
temp = static_cast<type>(i); // but there's only 5 to check
if (myStrComp(name, typeName(temp)) == 0) {
return temp;
}
}
return none; // shouldn't get here
}
int myStrComp(const char *str1, const char *str2) {
while (*str1 == *str2) {
if (!*str1) {
return 0; // strings are equal
}
str1++;
str2++;
}
return *str1 - *str2; // how different are they alphabetically
}