我正在使用
我有一个包含逗号分隔的ID列表的
这个方法可行,但似乎不够简洁。有更简明的方法吗?
BOOST_STRONG_TYPEDEF
来防止不同基于字符串的ID类型的滥用。但是我遇到了原始类型和其typedef之间的兼容性问题。我有一个包含逗号分隔的ID列表的
std::string
,我需要将它们存储到一个集合中。代码看起来像这样:#include <boost/algorithm/string/split.hpp>
#include <boost/serialization/strong_typedef.hpp>
#include <boost/algorithm/string/classification.hpp>
#include <set>
#include <vector>
BOOST_STRONG_TYPEDEF(std::string, MY_ID)
int main()
{
std::string line("ID1,ID2,ID3");
// Use boost::split to get all the strings into a vector
std::vector<std::string> id_vec;
boost::split(id_vec, line, boost::is_any_of(","));
// Generate a set of MY_ID. Do not use range constructor since the compiler
// error is clearer this way
std::set<MY_ID> ids;
for (auto const & id : id_vec)
{
ids.insert(id);
}
}
这段代码无法编译,因为无法将 std::string
插入到 std::set<MY_ID>
中。然而,如果我将向量的类型声明为 std::vector<MY_ID>
,它就无法与 boost::split
一起使用。
我已经找到了一种解决方法,通过添加临时变量来插入:
for (auto const & id : id_vec)
{
MY_ID tmp(id);
ids.insert(tmp);
}
这个方法可行,但似乎不够简洁。有更简明的方法吗?
()
而不是{}
,但这样可能会更不安全。或者只需使用static_cast<MY_ID>(id)
即可。 - Angew is no longer proud of SOstatic_cast<>
但它没有起作用。我已经仔细检查过了,它确实可以使用,所以原始代码中可能还有其他问题。现在看来这似乎是一个微不足道的问题! - user2891462