我想使用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(
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
答案 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_cast
。relaxed
启用各种有用的默认值。 没有relaxed
,any
完全支持您指定的内容和 别的什么 。 特别是,它允许默认构造和 分配any
。