处理boost变量和boost函数

时间:2015-04-13 14:13:43

标签: c++ function boost variant

我想要一个向量来保存不同类型的boost :: function,所以,我尝试了一个变体:

#include <boost/variant.hpp>
#include <boost/bind.hpp>
#include <boost/function.hpp>

#include <vector>

void a(int, int)
{}


void b()
{}


int main(int argc, char **argv)
{
    typedef boost::variant<boost::function0<void>, boost::function2<void, int, int>> v;

    std::vector<v> c;

    c.push_back(boost::bind(&a, _1, _2));
    c.push_back(boost::bind(&b));

    auto& function = boost::get<boost::function2<void, int, int>>(c[0]);

    function(4, 5);
}

但我有这个错误:

   /usr/local/include/boost/variant/variant.hpp:1515:28: error: call to member function 'initialize' is ambiguous
              initializer::initialize(
              ~~~~~~~~~~~~~^~~~~~~~~~
/usr/local/include/boost/variant/variant.hpp:1692:9: note: in instantiation of function template specialization 'boost::variant<boost::function0<void>, boost::function2<void, int, int>, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_, boost::detail::variant::void_>::convert_construct<boost::_bi::bind_t<void, void (*)(int, int), boost::_bi::list2<boost::arg<1>, boost::arg<2> > > >' requested here
        convert_construct( detail::variant::move(operand), 1L);
        ^

我没有找到任何帮助来处理这些错误

(和其他编译器输出) https://ideone.com/QEdlyF

谢谢!

1 个答案:

答案 0 :(得分:4)

Boost Function的构造函数在它可以接受的东西方面相当自由。这导致没有最好的&#34;变体的元素类型中的构造函数。

你必须明确施放。

然后,再一次隐藏关于类型的知识可能更容易(因为有用的部分反正是模棱两可的)并使用Boost Any。