C++ 处理boost变量和boost函数

C++ 处理boost变量和boost函数,c++,function,boost,variant,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) { typ

我想要一个向量来容纳不同种类的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);
}
#包括
#包括
#包括
#包括
无效a(整数,整数)
{}
无效b()
{}
int main(int argc,字符**argv)
{
typedef boost::变量v;
std::向量c;
c、 向后推(boost::bind(&a,_1,_2));
c、 向后推(boost::bind(&b));
auto&function=boost::get(c[0]);
功能(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);
        ^
/usr/local/include/boost/variant/variant.hpp:1515:28:错误:对成员函数“initialize”的调用不明确
初始化器::初始化(
~~~~~~~~~~~~~^~~~~~~~~~
/usr/local/include/boost/variant/variant.hpp:1692:9:注意:在函数模板专门化的实例化中,此处请求“boost::variant::convert_construct”
转换构造(细节::变量::移动(操作数),1L);
^
我没有找到任何帮助来处理这些错误

(和其他编译器输出)


谢谢!

Boost函数的构造函数在它可以接受的方面非常自由。这导致在变量的元素类型中没有“最佳”构造函数

您必须显式地强制转换


此外,可能更容易将类型的知识全部隐藏起来(因为有用的部分无论如何都是模糊的)并使用Boost Any。

Boost函数的构造函数在它可以接受的方面非常自由。这导致变量的元素类型中没有“最佳”构造函数

您必须显式地强制转换


再说一次,把关于类型的知识全部隐藏起来(因为有用的部分是模棱两可的)并使用Boost Any可能更容易一些。

当你基本上是这样的时候,你声称“我没有找到任何帮助来处理这些错误”,这有点可笑。在这里我展示了如何使用显式类型转换来完成这项工作。:)是的,因为我适应了(有点抄袭过去)你的例子到我的代码中,我得到了这个错误,但我没有找到你的显式转换:(好的。我很高兴你现在找到了它。省去了我在这里制作示例的麻烦:)当你基本上说“我没有找到任何帮助来处理这些错误”时,这有点可笑。在这里,我展示了如何使用显式转换来完成这项工作。:)是的,因为我把你的例子改编成了我的代码,所以我犯了这个错误,没有找到你的显式类型转换:(好的。我很高兴你现在找到了。省去了在这里制作示例的麻烦:)