带有std::map的Boost::factory函数调用

boost::factory with std::map bad function call

本文关键字:factory 函数调用 Boost map std 带有      更新时间:2023-10-16

我在理解boost::factory如何工作时遇到了问题。下面的代码将抛出test2的变量

#include <boost/functional/factory.hpp>
#include <boost/function.hpp>
typedef boost::function<A*()> creator;
typedef std::map<string,creator> factory;
class A{
}
class AA : A {
}
class AB : A {
}
class C{
public: 
 C(factory& f);
 factory _f;
}
int main(){
 factory f;
 f["1"] = boost::factory<AA*>();
 f["2"] = boost::factory<AB*>();
 C test(f);
 C test2(f);
}
C::C(factory& f){
  _f = f;
  A* t = _f["1"]();
}

消息是

的实例抛出后被调用boost:: exception_detail:: clone_impl

' what(): call to empty boost::function

我想我不理解这里的复制/移动行为,这就是导致问题的原因。据我所知,工厂是在C::C中复制的,所以每次调用_f[something]()都应该调用自己的函数。但是不知何故,函数被移出了工厂的test元素,然后我得到了一个错误的函数调用,因为f["1"]处于未定义状态。请帮助。

据我所知,工厂被复制到C::C

是的。

但是不知怎么的,这个函数被移出了test

的元素

不。如果是这样,你可能在其他地方有未定义行为。或者您可能正在运行不同的(有bug的)boost版本(这似乎极不可能)。

看看是否可以用下面的代码复制它:

Live On Coliru

#include <boost/functional/factory.hpp>
#include <boost/function.hpp>
#include <map>
#include <iostream>
struct A {};
struct AA : A {
    AA() { std::cout << __PRETTY_FUNCTION__ << "n"; }
};
struct AB : A {
    AB() { std::cout << __PRETTY_FUNCTION__ << "n"; }
};
typedef boost::function<A*()> creator;
typedef std::map<std::string, creator> factory;
struct C {
    C(factory &f){
        _f = f;
        for (auto& e : _f)
            std::cout << "entry for " << e.first << " present " << (!!e.second) << "n";
    }
    factory _f;
};
int main() {
    factory f;
    f["1"] = boost::factory<AA*>();
    f["2"] = boost::factory<AB*>();
    C test(f);
    delete f["1"]();
    delete f["2"]();
    delete f["1"]();
    delete f["2"]();
    C test2(f);
    delete f["1"]();
    delete f["2"]();
    delete f["1"]();
    delete f["2"]();
}

打印

entry for 1 present 1
entry for 2 present 1
AA::AA()
AB::AB()
AA::AA()
AB::AB()
entry for 1 present 1
entry for 2 present 1
AA::AA()
AB::AB()
AA::AA()
AB::AB()