我为double 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){...});
有没有办法改善这种推论,所以我只需要传递函数参数?
如果可能的话,需要visual studio 2013 compatible v2.1 compiler支持
最佳答案
如果您需要做的就是检查lambda是否将TYPE_OF_ENTITY*
类型的值作为参数,则实际上不需要将函数拆分为两个单独的重载(对于statefull和无状态lambda)。您可以简单地检查是否可以使用这种参数来调用它,例如:
#include <type_traits> // for std::declval
template <typename TYPE_OF_ENTITY, typename LAMBDA_FUNC>
auto foreach_t(list faces, LAMBDA_FUNC func) -> decltype(func(std::declval<TYPE_OF_ENTITY*>()), void())
{
for(...)
for(...)
func(pEnt)
}