我正在使用 BOOST_STRONG_TYPEDEF
以防止滥用不同的基于字符串的 ID 类型。然而,我遇到了原始类型与其 typedef 之间的兼容性问题。
我有一个 std::string
其中包含 ID 列表,以逗号分隔。我需要将它们存储到一个集合中。代码如下所示:
#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>
.但是,如果我将 vector 声明为 std::vector<MY_ID>
类型它不适用于 boost::split
.
我通过在插入时添加时间变量找到了解决方法:
for (auto const & id : id_vec)
{
MY_ID tmp(id);
ids.insert(tmp);
}
这行得通,但看起来很老套。有没有更简洁的方法?
最佳答案
强 typedef 的全部要点是在从其基础类型创建强 typedef 时需要显式转换。所以使用显式转换语法:
for (auto const & id : id_vec)
{
ids.insert(MY_ID{id});
}
进行转换的替代方法是 static_cast<MY_ID>(id)
和 MY_ID(id)
(注意后者等同于 C 风格的转换 (MY_ID)id
,因此最好避免)。
关于c++ - typedef 之间的兼容性问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43135829/