我想要一个 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/