簡體   English   中英

為 boost::property_maps 中的枚舉專門化 boost::lexical_cast

[英]specializing boost::lexical_cast for enums in boost::property_maps

我正在嘗試使用在其捆綁的頂點屬性中具有enumboost::graph 當我嘗試將捆綁屬性用於 boost::dynamic_property 時,問題就開始了。 看起來我無法為 boost::lexical_cast 獲得正確的模板特化來識別類型。

#include <string>
#include <iostream>
#include <boost/lexical_cast.hpp>
#include <boost/graph/adjacency_list.hpp>
#include <boost/property_map/dynamic_property_map.hpp>

enum MyEnum { A, B, C };

namespace boost{
    template<>
    std::string lexical_cast(const MyEnum & m)
    {
        return std::to_string(int(m));
    }
} /* boost */

struct EnumWrapper
{
    MyEnum e;

    EnumWrapper() = default;
    EnumWrapper(MyEnum e) : e{e}
    {}
};

int main()
{
    using namespace boost;

    // This works
    MyEnum e{MyEnum::B};
    std::cout << lexical_cast<std::string>(e) << std::endl;

    // This doesn't compile
    adjacency_list<vecS, vecS, directedS, EnumWrapper> graph;
    dynamic_properties dp;
    dp.property("test", get(&EnumWrapper::e, graph));

    return 0;
}

如果我嘗試直接編寫enum ,則一切正常。 嘗試將其放入動態屬性時,出現以下錯誤:

In file included from /usr/include/boost/iterator/iterator_categories.hpp:22:0,
                 from /usr/include/boost/iterator/iterator_facade.hpp:14,
                 from /usr/include/boost/range/iterator_range_core.hpp:27,
                 from /usr/include/boost/lexical_cast.hpp:30,
                 from main.cpp:3:
/usr/include/boost/lexical_cast/detail/converter_lexical.hpp: In instantiation of ‘struct boost::detail::deduce_target_char_impl<boost::detail::deduce_character_type_later<MyEnum> >’:
/usr/include/boost/lexical_cast/detail/converter_lexical.hpp:270:89:   required from ‘struct boost::detail::deduce_target_char<MyEnum>’
/usr/include/boost/lexical_cast/detail/converter_lexical.hpp:407:92:   required from ‘struct boost::detail::lexical_cast_stream_traits<std::__cxx11::basic_string<char>, MyEnum>’
/usr/include/boost/lexical_cast/detail/converter_lexical.hpp:468:15:   required from ‘struct boost::detail::lexical_converter_impl<MyEnum, std::__cxx11::basic_string<char> >’
/usr/include/boost/lexical_cast/try_lexical_convert.hpp:181:44:   required from ‘bool boost::conversion::detail::try_lexical_convert(const Source&, Target&) [with Target = MyEnum; Source = std::__cxx11::basic_string<char>]’
/usr/include/boost/lexical_cast.hpp:41:60:   required from ‘Target boost::lexical_cast(const Source&) [with Target = MyEnum; Source = std::__cxx11::basic_string<char>]’
/usr/include/boost/property_map/dynamic_property_map.hpp:44:38:   required from ‘Value boost::detail::read_value(const string&) [with Value = MyEnum; std::__cxx11::string = std::__cxx11::basic_string<char>]’
/usr/include/boost/property_map/dynamic_property_map.hpp:158:64:   required from ‘void boost::detail::dynamic_property_map_adaptor<PropertyMap>::do_put(const boost::any&, const boost::any&, mpl_::bool_<true>) [with PropertyMap = boost::vec_adj_list_vertex_property_map<boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS, EnumWrapper>, boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS, EnumWrapper>*, MyEnum, MyEnum&, MyEnum EnumWrapper::*>]’
/usr/include/boost/property_map/dynamic_property_map.hpp:186:11:   required from ‘void boost::detail::dynamic_property_map_adaptor<PropertyMap>::put(const boost::any&, const boost::any&) [with PropertyMap = boost::vec_adj_list_vertex_property_map<boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS, EnumWrapper>, boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS, EnumWrapper>*, MyEnum, MyEnum&, MyEnum EnumWrapper::*>]’
main.cpp:40:1:   required from here
/usr/include/boost/lexical_cast/detail/converter_lexical.hpp:243:13: error: static assertion failed: Target type is neither std::istream`able nor std::wistream`able
             BOOST_STATIC_ASSERT_MSG((result_t::value || boost::has_right_shift<std::basic_istream<wchar_t>, T >::value),

Target type is neither std::istreamable nor std::wistreamable向我暗示, lexical_cast 沒有正確專門化。 然而,直接使用詞法轉換似乎工作得很好。

Target = MyEnum; Source = std::__cxx11::basic_string<char> Target = MyEnum; Source = std::__cxx11::basic_string<char> Boost 正在嘗試string轉換MyEnum 你只提供了相反的方向。

您需要提供stringMyEnum的轉換:

namespace boost{
    template<>
    MyEnum lexical_cast(const std::string & s) {
        return MyEnum::A;    // for example
    }
} /* boost */

例子

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM