typedef

时间:2017-03-31 08:18:34

标签: 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>。但是,如果我将向量声明为std::vector<MY_ID>类型,则它不适用于boost::split

我通过在插入时添加时间变量找到了解决方法:

for (auto const & id : id_vec)
{
    MY_ID tmp(id);
    ids.insert(tmp);
}

这有效,但看起来很骇人。有更简洁的方法吗?

1 个答案:

答案 0 :(得分:3)

强类型定义的重点是在从其基础类型创建强类型定义时需要显式转换。因此,请使用显式转换语法:

for (auto const & id : id_vec)
{
    ids.insert(MY_ID{id});
}

进行转化的其他方法是static_cast<MY_ID>(id)MY_ID(id)(请注意,后者等同于C风格的演员(MY_ID)id,因此最好避免使用。)