- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试使用 boost::graph
,它在其捆绑的顶点属性中有一个 enum
。当我尝试将捆绑属性用于 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>
. Boost 正在尝试从 string
转换到 MyEnum
;你只提供了相反的方向。
您需要提供来自的转化 string
到 MyEnum
:
namespace boost{
template<>
MyEnum lexical_cast(const std::string & s) {
return MyEnum::A; // for example
}
} /* boost */
Example .
关于c++ - 为 boost::property_maps 中的枚举专门化 boost::lexical_cast,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36937912/
我想从一个图获得两组组最短路径(一对多),定义为adjacency_list内部属性(相对于 bundle) 理论上我可以在两个引用节点 n1 和 n2 上运行 dijkstra_shortest_p
我正在使用来自 Boost c++ 库 v1.53 的 property_map,它对我来说非常有用,除了我无法弄清楚如何解析具有相同名称且彼此对等的数据节点。如以下 XML 所示:
(为标题道歉,我想不出一个短于 140 个字符的好标题...) 我正在为 boost::graph 库编写图形算法。在我的算法中,我需要保留关于节点的变量、权重和计数器。据我从文档和查看其他人的代码可
调用boost::get时在图表上,返回类型是 boost::associative_property_map .我想要一份这张 map 的拷贝,我想将它存储在 boost::vector_prope
我正在尝试使用 boost::graph,它在其捆绑的顶点属性中有一个 enum。当我尝试将捆绑属性用于 boost::dynamic_property 时,问题就开始了。看起来我无法获得 boost
我已阅读boost docs弄清楚如何使用 property_map。 基于 // Property map accessors template property_map::type get(Pro
我正在尝试实例化 boost::mutable_queue 的简单版本自定义 Node我定义的类型。我可以毫不费力地实例化 mutable_queue使用以下代码片段的实例(使用 std 和 boos
一段时间以来,我一直在努力使用 Boost 框架来实现 Djikstra 的算法,但我似乎无法弄清楚我遗漏了什么。 使用在以下位置找到的示例:https://www.boost.org/doc/lib
我正在寻找一种将 Boost Graph Library 与 Boost uBLAS 结合使用的巧妙方法。更准确地说,我需要使用图邻接矩阵和包含其他一些的 vector 之间的标量积的结果来更新每个顶
我是一名优秀的程序员,十分优秀!