Я пытаюсь написать функцию, которая создает битовую маску путем тестирования последовательности объектов с предикатом произвольной формы:
template<typename... Args, bool(*TestingFunc)(Object, Args...)>
inline uint32_t getMask(const std::vector<Object>& objects, Args... args)
{
uint32_t mask = 0;
for(size_t i = 0; i < objects.size(); i++)
if(TestingFunc(objects[i], args...))
mask |= 1 << i;
return mask;
}
Однако приведенный выше код не работает: gcc / clang reportno matching function for call to
при каждом вызове функции (note: candidate template ignored: invalid explicitly-specified argument for template parameter 'Args'
с помощью clang, note: template argument deduction/substitution failed:
с помощью gcc; вызов getMask<int, pred1>(objects, 10)
, предикат bool pred1(Object, int)
, см. информацию ниже).
Естьнесколько четко определенных предикатов, которые принимают различное количество дополнительных аргументов, специфичных для вызова getMask()
.Каждый предикат является простой функцией.В идеале, функция getMask()
должна быть написана так, чтобы я мог вызывать ее следующим образом:
/* bool predicate1(Object, size_t, size_t, int, int); */
mask = getMask<predicate1>(objects, a.height(), b.width(), 10, 15);
/* ... */
/* bool predicate2(Object, int, int); */
mask = getMask<predicate2>(objects, x, y);
Это горячая точка в моей программе;производительность имеет решающее значение.getMask()
и предикаты помечены встроенными.Код должен быть написан на C ++ 11 (не на C ++ 14 или выше).
Итак, как следует писать getMask()
?