C ++将字符串转换为枚举?

时间:2015-04-05 18:36:46

标签: templates c++11 boost enums

我试图在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中,但我正在测试它。

1 个答案:

答案 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