typedef之间的兼容性问题

3
我正在使用BOOST_STRONG_TYPEDEF来防止不同基于字符串的ID类型的滥用。但是我遇到了原始类型和其typedef之间的兼容性问题。
我有一个包含逗号分隔的ID列表的std::string,我需要将它们存储到一个集合中。代码看起来像这样:
#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个回答

3
强类型定义的整个目的在于创建强类型定义时需要进行显式转换,以便将其底层类型与之分离。因此,请使用显式转换语法:

强类型定义的整个目的在于创建强类型定义时需要进行显式转换,以便将其底层类型与之分离。因此,请使用显式转换语法:

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

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


非常感谢,我之前不知道这个 C++11 的特性 :) - user2891462
@user2891462 C++98 的方法是使用 () 而不是 {},但这样可能会更不安全。或者只需使用 static_cast<MY_ID>(id) 即可。 - Angew is no longer proud of SO
哦!我很惊讶,我记得尝试过 static_cast<> 但它没有起作用。我已经仔细检查过了,它确实可以使用,所以原始代码中可能还有其他问题。现在看来这似乎是一个微不足道的问题! - user2891462
1
@user2891462 多数问题一旦你知道答案就会变得很简单,也被称为“显而易见的笑话”。(http://forums.xkcd.com/viewtopic.php?p=143064&sid=d2195cf9e59ceb93377e22e4216135ae#p143064) - Angew is no longer proud of SO

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接