类型定义之间的兼容性问题
Compatibility issues between typedefs
我正在使用BOOST_STRONG_TYPEDEF
来防止滥用不同的基于字符串的ID类型。但是,我遇到了原始类型与其类型定义之间的兼容性问题。
我有一个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>
。但是,如果我将向量声明为类型 std::vector<MY_ID>
它将无法与 boost::split
一起使用。
我通过在插入时添加时间变量找到了解决方法:
for (auto const & id : id_vec)
{
MY_ID tmp(id);
ids.insert(tmp);
}
这有效,但似乎很笨拙。有没有更简洁的方法?
强 typedefs 的全部意义在于,在从其底层类型创建强 typedef 时,需要显式转换。因此,请使用显式转换语法:
for (auto const & id : id_vec)
{
ids.insert(MY_ID{id});
}
进行转换的替代方法是static_cast<MY_ID>(id)
和MY_ID(id)
(请注意,后者等同于 C 样式转换(MY_ID)id
,因此最好避免(。
相关文章:
- 提升序列化 1:73 的向后兼容性问题
- C++ ABI 兼容性问题/张量流
- Oracle OCCI 和 g++ 7.1 的兼容性问题
- python 和 swig 版本兼容性问题
- Tensorflow C++ API 和 Caffe 兼容性问题与 Glog 相关
- 潜在 DLL 兼容性问题的摘要?
- D3DX10.H和D3DCOMPILER.H兼容性问题
- 类型定义之间的兼容性问题
- 在使用__file__,__line__时,是否存在任何兼容性问题
- Mac和Linux机器之间的正则兼容性问题
- Clang和Visual C 结构兼容性问题
- 从C结构继承的可能兼容性问题
- UNICODESTRING兼容性问题
- 错误:在armadillo和oracle occi兼容性问题中,对"剑"的引用不明确
- box2d光线投射向后兼容性问题
- .NET 和 Linux 之间的 GUID/UUID 兼容性问题
- Boost::asio-winsock和winsock 2的兼容性问题
- 使用控制台的可视C++:while 循环的字符/字符串兼容性问题
- 7-Zip源代码兼容性问题
- Java本机接口(JNI)是否受到c++ ABI兼容性问题的影响