Я новичок в улучшении стирания типов, и у меня возникают проблемы с преобразованием объектов обратно в их первоначальный тип. Исходя из того, как я понимаю документацию по надстройке, я должен иметь возможность использовать boost :: any_cast для преобразования стертого объекта обратно в его исходный тип, но следующий код завершается ошибкой с исключением bad_any_cast. Что я делаю неправильно?
Огромное спасибо!
https://www.boost.org/doc/libs/1_67_0/doc/html/boost/any_cast.html
BOOST_TYPE_ERASURE_MEMBER((has_x), x, 0)
namespace bte = boost::type_erasure;
using xConcept = boost::mpl::vector<has_x <float(), bte::_self> ,
bte::copy_constructible<>,
bte::relaxed>;
using AnyXobject = bte::any<xConcept, bte::_self>;
struct xThing{
float x(){
return 4.;
}
float y(){
return 5.;
}
};
int main(){
// instance of concrete implementation
xThing i;
// using concrete implementation to construct type erased object
AnyXobject xconc(i);
// calling x() correctly prints 4
std::cout << xconc.x() << std::endl;
// converting back to concrete implementation fails with boost::bad_any_cast at runtime
auto j = boost::any_cast<xThing>(xconc);
return 0;
}
Вам нужно позвонить boost::type_erasure::any_cast
Вот исправленная программа:
#include <boost/type_erasure/any.hpp>
#include <boost/type_erasure/any_cast.hpp>
#include <boost/type_erasure/member.hpp>
#include <iostream>
BOOST_TYPE_ERASURE_MEMBER((has_x), x, 0)
namespace bte = boost::type_erasure;
using xConcept = boost::mpl::vector<has_x <float(), bte::_self> ,
bte::copy_constructible<>,
bte::relaxed>;
using AnyXobject = bte::any<xConcept, bte::_self>;
struct xThing{
float x(){
return 4.;
}
float y(){
return 5.;
}
};
int main(){
// instance of concrete implementation
xThing i;
// using concrete implementation to construct type erased object
AnyXobject xconc(i);
// calling x() correctly prints 4
std::cout << xconc.x() << std::endl;
// converting back to concrete implementation fails with boost::bad_any_cast at runtime
auto j = bte::any_cast<xThing>(xconc);
return 0;
}
Других решений пока нет …