gpt4 book ai didi

c++ - 在模板中使用 boost::function

转载 作者:行者123 更新时间:2023-11-30 03:48:36 30 4
gpt4 key购买 nike

我对 boost::function 和模板函数有疑问。场景如下;

我想在另一个名为“setter”的函数中运行一个函数。我的功能类似于

data.totalSize(TotalSize);

totalSize 函数输入参数类型为“uint32_t”,输出参数类型为“void”。

所以我决定使用 boost::function;下面是我的代码:

setter(boost::bind(&myIDL::payload::totalSize,boost::ref(data),_1),(TotalSize));

setter 实现是

template<typename Outer>
inline void setter(boost::function<void(Outer)> myFunc, Outer myValue)
{
myFunc(myValue);
}

我会得到以下编译错误:

error: no matching function for call to setter(boost::_bi::bind_t<void, boost::_mfi::mf1<void,myIDL::payload, unsigned int>, boost::_bi::list2<boost::reference_wrapper<myIDL::payload>, boost::arg<1> > >, quint32&)'

boost::function 似乎不理解我的模板类型。所以我决定写成如下:

template<typename Outer>
inline void setter(boost::function<void(unit32_t)> myFunc, Outer myValue)
{
myFunc(myValue);
}

而且有效!所以我想知道如何解决我的问题。预先感谢您的帮助。

最好的问候,礼萨

最佳答案

模板参数类型推导仅推导 类型,它不考虑任何转换。就像编译器没有通知您一样,boost::bind 的结果产生了某种不可描述类型的纯右值:

boost::_bi::bind_t<void, boost::_mfi::mf1<void,myIDL::payload
, unsigned int>
, boost::_bi::list2<boost::reference_wrapper<myIDL::payload>
, boost::arg<1> > >

很明显,不同:

boost::function<void(Outer)>

也就是说,类型模板参数 Outer 不能从参数表达式的类型中推导出来。一个解决方案是接受任何函数对象:

template <typename F, typename Outer>
inline void setter(F myFunc, Outer myValue)
{
myFunc(myValue);
}

或者将 Outer 放在非推导上下文中(并付出类型删除的代价):

#include <boost/mpl/identity.hpp>

inline void setter(boost::function<void(typename boost::mpl::identity<Outer>::type)> myFunc
, Outer myValue)
{
myFunc(myValue);
}

关于c++ - 在模板中使用 boost::function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33096012/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com