如何重新绑定Boost.TypeErasure任何< ...>宾语

时间:2014-05-25 12:00:53

标签: c++ boost

我想使用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(
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1 个答案:

答案 0 :(得分:1)

引用usage documentation,强调relaxed启用的内容:

  

图书馆的主要类是任何。任何人都可以存储对象   满足我们指定的任何要求。这些要求通过了   任何作为MPL序列。

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

copy_constructible是一个内置概念,允许我们复制和   破坏物体。 typeid_提供运行时类型信息   我们可以使用any_castrelaxed启用各种有用的默认值。   没有relaxedany完全支持您指定的内容和   别的什么 特别是,它允许默认构造和   分配any