大佬教程收集整理的这篇文章主要介绍了c – 在Boost Phoenix中获取局部变量的类型,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
#include <boost/proto/proto.hpp> #include <boost/phoenix.hpp> namespace proto = boost::proto; namespace phoenix = boost::phoenix; using namespace phoenix::local_names; struct Foo { const char str[6] = " Ok.\n"; }; int main(int argc,char *argv[]) { auto f = phoenix::lambda(_a = 17,_b = Foo()) [ std::cout << _a << phoenix::bind(&Foo::str,_b) ]; typedef typename proto::tag_of<decltype( f )>::type tag; typedef typename proto::tag_of<decltype(proto::child_c<2>(f))>::type tagc; static_assert(proto::arity_of<decltype(f)>::value==3,""); static_assert(std::is_same<tag,phoenix::tag::lambda_actor>::value,""); static_assert(std::is_same<tagc,proto::tag::shift_left>::value,""); return 0; }
#include <iostream> #include <typeinfo> #include <String> #include <cxxabi.h> #include <type_Traits> #include <boost/proto/proto.hpp> #include <boost/phoenix.hpp> namespace proto = boost::proto; namespace phoenix = boost::phoenix; using namespace phoenix::local_names; namespace fusion = boost::fusion; struct Foo { const char str[6] = " Ok.\n"; }; std::string demangle(const char* mangledName) { int status; char* result = abi::__cxa_demangle(mangledName,nullptr,&status); switch(status) { case -1: std::cerr << "Out of memory!" << std::endl; exit(1); case -2: return mangledName; case -3: // Should never happen,but just in case? return mangledName; } std::string name = result; free(result); return name; } template <typename Lambda,int n> struct get_local_type { typedef typename proto::result_of::value<typename proto::result_of::child_c<Lambda,0>::type >::type vector_of_locals_type; typedef typename proto::result_of::value<typename fusion::result_of::at_c<vector_of_locals_type,N>::type >::type ref_type; typedef typename std::remove_reference<ref_type>::type type; }; template <typename Lambda,typename Arg> struct get_local_type_from_name { typedef typename proto::result_of::value<Arg>::type local_name; typedef typename proto::result_of::value<typename proto::result_of::child_c<Lambda,1>::type >::type map_type; typedef typename phoenix::detail::get_index<map_type,local_name>::type index; typedef typename get_local_type<Lambda,index::value>::type type; }; int main(int argc,char *argv[]) { auto f = phoenix::lambda(_b = 17,_a = Foo()) [ std::cout << _b << phoenix::bind(&Foo::str,_a) ]; std::cout << std::endl << "This is the whole lambda expression:" << std::endl; std::cout << std::endl << demangle(typEID(f).name()) << std::endl; std::cout << std::endl << "Take the first child:" << std::endl; std::cout << std::endl << demangle(typEID(proto::child_c<0>(f)).name()) << std::endl; std::cout << std::endl << "Then its value (this is a vector that contains the types you want):" << std::endl; std::cout << std::endl << demangle(typEID(proto::value(proto::child_c<0>(f))).name()) << std::endl; std::cout << std::endl << "Take the first element of that vector:" << std::endl; std::cout << std::endl << demangle(typEID(fusion::at_c<0>(proto::value(proto::child_c<0>(f)))).name()) << std::endl; std::cout << std::endl << "Take the value of that element:" << std::endl; std::cout << std::endl << demangle(typEID(proto::value(fusion::at_c<0>(proto::value(proto::child_c<0>(f))))).name()) << std::endl; typedef typename proto::tag_of<decltype( f )>::type tag; typedef typename proto::tag_of<decltype(proto::child_c<2>(f))>::type tagc; static_assert(proto::arity_of<decltype(f)>::value==3,""); typedef typename get_local_type<decltype(f),0>::type type_of_1st; typedef typename get_local_type<decltype(f),1>::type type_of_2nd; typedef typename get_local_type_from_name<decltype(f),_a_type>::type type_of_a; typedef typename get_local_type_from_name<decltype(f),decltype(_b)>::type type_of_b; static_assert(std::is_same<type_of_1st,int>::value,""); static_assert(std::is_same<type_of_2nd,Foo>::value,""); static_assert(std::is_same<type_of_a,""); static_assert(std::is_same<type_of_b,""); return 0; }
以上是大佬教程为你收集整理的c – 在Boost Phoenix中获取局部变量的类型全部内容,希望文章能够帮你解决c – 在Boost Phoenix中获取局部变量的类型所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。