gpt4 book ai didi

c++ - MPL 映射实例化类型

转载 作者:行者123 更新时间:2023-11-28 04:44:20 26 4
gpt4 key购买 nike

我有以下内容:

class Message
{
public:
bool process()
{
return doProcess();
}
protected:
virtual bool doProcess() = 0;
};

class Hello : public Message
{
protected:
bool doProcess()
{
return false;
}
};
typedef typename boost::mpl::map< boost::mpl::pair< boost::mpl::int_< 0 >, Hello > > map;

struct Generator
{
typedef void result_type;
template< typename t_type >
void operator()(std::vector< boost::shared_ptr< Message > >& processors,
t_type p_element)
{
typedef typename boost::mpl::at< map, t_type >::type c_instanceType
boost::shared_ptr< Message > temp(reinterpret_cast< Message* >(new c_instanceType));
p_processors[p_element] = temp;
}
};

然后像这样调用:

class MessageProcessor
{
public:
MessageProcessor() :
m_processors(12)
{
// eventually there will be 12 different messages so I will add
// them to the mpl map and adjust the range
boost::mpl::for_each< boost::mpl::range_c< boost::uint8_t, 0, 1 > >
(
boost::bind(Generator(), boost::ref(m_processors), _1)
}
private:
std::vector< boost::shared_ptr< Message > > m_processors;
};

这段代码编译干净;但是,当稍后像这样调用该函数时:

m_processors[0]->process();

返回do process 的process 函数中的行发生段错误。我在 gcc 4.8 中工作,boost 版本为 1.55。另请注意,这不是完整的代码。使用调试器时,我发现调用 doProcess 时 vptr 似乎为空,因此子类似乎不存在。关于如何解决此问题的任何想法?

最佳答案

所以问题似乎是在执行 at<> 时实际上并未找到该类型,并且返回了其他内容而不是 Hello 类型。看起来像是boost::for_each传入的类型是类型,boost::mpl::integral_c<boost::uint8_t, 0>它在 mpl map 中不存在,因为我正在存储 boost::mpl::int_<0>作为关键。将 map 中的键类型更改为 boost::mpl::integeral_c< boost::uint8_t, 0 >不会出现段错误并按预期执行。

关于c++ - MPL 映射实例化类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49582856/

26 4 0
文章推荐: c++ - 使用 dialog_fselect 选择文件
文章推荐: javascript - 根据