gpt4 book ai didi

c++ - typedef 之间的兼容性问题

转载 作者:太空狗 更新时间:2023-10-29 21:13:45 26 4
gpt4 key购买 nike

我正在使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com