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

标签 c++ c++11 boost typedef

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

相关文章:

iphone - boost armv7构建

c++ - 用 C++ 写入文件

c++ - 有没有办法标记不可重入 C 库调用的使用?

c++11 STL 的 binomial_distribution 极慢

c++ - 如何将指针传递给指针 vector ?

c++ - 为什么这个 c++ 代码不能在 g++ 4.8.2 中编译

c++ - boost::作为友元类的变体

c++ - Boost ASIO socket 消耗文件描述符

c++ - 来自片段着色器中 GL_TEXTURE_1D 的样本

c++ - 不同大小的着色器存储缓冲区内容 "transfered"到数组缓冲区