【发布时间】:2017-05-30 09:26:41
【问题描述】:
我为必须执行很多并且过去使用宏完成的双 for 循环构建了这个模板函数:
template <typename TYPE_OF_ENTITY, typename LAMBDA_FUNC>
void foreach_t(list faces, LAMBDA_FUNC func)
{
for(...)
for(...)
func(pEnt)
}
这很好用,可以调用:
foreach_t<FACE>(faces,[&](FACE* pFace){...});
然后我想确保您的 lambda 必须将 TYPE_OF_ENTITY* 作为参数。为此,我需要一个有状态和无状态的模板函数。
template <typename TYPE_OF_ENTITY, typename LAMBDA_RETURN_TYPE>
using functionPtr = LAMBDA_RETURN_TYPE(*)(TYPE_OF_ENTITY*);
template <typename TYPE_OF_ENTITY, typename LAMBDA_RETURN_TYPE>
void foreach_t(list faces, functionPtr<TYPE_OF_ENTITY, LAMBDA_RETURN_TYPE> func)
{
for(...)
for(...)
func(pEnt)
}
template <typename TYPE_OF_ENTITY, typename LAMBDA_RETURN_TYPE>
void foreach_t(list faces, std::function<LAMBDA_RETURN_TYPE(TYPE_OF_ENTITY*)> func)
{
for(...)
for(...)
func(pEnt)
}
它们按我的意愿工作,只是现在我必须指定 2 个模板参数,因为它们不能再被推导出来:
foreach_t<FACE, void>(faces,[&](FACE* pFace){...});
有没有办法改进这个推论,所以我只需要传递函数参数?
【问题讨论】:
标签: c++ lambda type-deduction