c++ - 处理 boost 变量和 boost 函数

标签 c++ function boost variant

我想要一个 vector 来保存不同类型的 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

谢谢!

最佳答案

Boost Function 的构造函数可以接受的内容非常自由。这导致变体的元素类型中没有“最佳”构造函数。

你必须显式地转换。

话又说回来,完全隐藏有关类型的知识(因为有用的部分无论如何都是模棱两可的)并使用 Boost Any 可能更容易。

关于c++ - 处理 boost 变量和 boost 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29607529/

相关文章:

c++ - 段错误 C++ 转换问题

c++ - 为什么这个 std::function 和运算符会导致段错误?

c++ - 重载模板 <typename ...> 类的函数模板

c++ - 使用 Boost find_last 查找任何

visual-c++ - MSVC 2017 缺少 libboost_filesystem-vc141-mt-gd-x32-1_66.lib 错误

c++ - 为什么我的派生类找不到我的基类的类型别名?

c - 使用函数更改指针包含的地址

PHP - 传递函数返回另一个函数

javascript - 诸如 Chai 之类的断言库如何在不强制调用函数的情况下工作?

c++ - 为什么 BOOST_TEST((Iterator == Iterator)) 需要额外的括号?