如何重新绑定 Boost.TypeErasure any<...> 对象

How do I rebind a Boost.TypeErasure any<...> object

本文关键字:lt gt 对象 any 何重新 绑定 Boost TypeErasure      更新时间:2023-10-16

我想使用Boost.TypeErasure any<...>对象作为多态函数对象。然而,我不知道如何重新绑定它(就像我可以与std::function)。下面的示例代码无法编译。

#include <boost/type_erasure/any.hpp>
#include <boost/type_erasure/callable.hpp>
using namespace boost::type_erasure;
namespace mpl = boost::mpl;
struct A { void operator()(int){} void operator()(double){} };
struct B { void operator()(int){} void operator()(double){} };
int main(int argc, const char * argv[])
{
   A a; B b;
   any < mpl::vector <
      callable<void(int)>,
      callable<void(double)>,
      copy_constructible<>
   >> x = a, y = b;
   x = y; // rebind x to b, doesn't compile
   return 0;
}

当使用clang-3.5 -std=c++11编译时,我得到了这个错误

/opt/local/include/boost/type_erasure/any.hpp:1083:9: error: no matching member function for call to
'_boost_type_erasure_assign_impl'
_boost_type_erasure_assign_impl(
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

引用使用文档,强调relaxed的功能:

标准库中的主类是any。any可以存储对象满足我们指定的任何要求。通过了这些要求作为MPL序列。

any<mpl::vector<copy_constructible<>, typeid_<>, relaxed> > x(10);
int i = any_cast<int>(x); // i == 10

copy_constructible是一个内置的概念,允许我们复制和销毁对象。typeid_提供了运行时类型信息我们可以使用any_castrelaxed启用各种有用的默认值。没有relaxed, any完全支持您指定的和没有其他特别地,它允许默认构造和any .