我试图在Linux上将字符串转换为枚举类型。我在stackoverflow上找到了这个代码来做这件事,但我不确定我是否正确使用了函数模板。它汇编得很好。
template <typename T>
typename boost::enable_if< boost::is_enum<T>, bool>::type
convert_string(const std::string& theString, T& theResult)
{
typedef typename std::underlying_type<T>::type safe_type;
std::istringstream iss(theString);
safe_type temp;
const bool isValid = !(iss >> temp).fail();
theResult = static_cast<T>(temp);
return isValid;
}
在这里,我试图正确使用它。
enum TestType {
A1,
B2,
C3
};
string s = "A1";
TestType tt;
convert_string(s, tt);
问题是convert_string失败,调用后tt始终为0。此外,枚举位于中间件的IDL中,但我正在测试它。
答案 0 :(得分:2)
您没有正确使用convert_string
功能。
typedef typename std :: underlying_type :: type safe_type;
这是确定枚举值的存储类型(例如,int,long long等)。
然后,此类型用于将theString
转换为temp
,这是 数字类型 。因此,istringstream
的工作原理是将 表示数值 的字符串(例如“0”,“1”等)转换为数值。< / p>
根据这些信息,你应该理解为什么你的代码不起作用,但是下面的代码呢。
enum TestType
{
A1,
B2,
C3
};
template<typename T>
typename std::enable_if<std::is_enum<T>::value, bool>::type
convert_string(const std::string& theString, T& theResult)
{
typedef typename std::underlying_type<T>::type safe_type;
std::istringstream iss(theString);
safe_type temp;
const bool isValid = !(iss >> temp).fail();
theResult = static_cast<T>(temp);
return isValid;
}
int main()
{
std::string s = "0"; // This is the value of A1
TestType tt;
std::cout << std::boolalpha << convert_string(s, tt) << "\n";
std::cout << std::boolalpha << (A1 == tt) << "\n";
return 0;
}
true
true
为了支持您的使用,您需要执行其他人在评论中建议的内容(例如mapping of string representation to enum)