类型定义之间的兼容性问题

Compatibility issues between typedefs

本文关键字:兼容性 问题 之间 定义 类型      更新时间:2023-10-16

我正在使用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,因此最好避免(。