Есть несколько шаблонных функций (с одинаковыми сигнатурами), таких как:
template <typename T, typename P> void f1(T t, P p);
template <typename T, typename P> void f2(T t, P p);
Есть также несколько функций с одинаковыми логами c, которые вызывают их с разными предикатами:
template <typename T> void g1(T t)
{
f1(t, Pred1{});
...
f1(t, Pred2{});
...
}
// same as g1 but calls f2 instead of f1
template <typename T> void g2(T t)
{
f2(t, Pred3{});
...
f2(t, Pred4{});
...
}
Я попытался обобщить их, и все, что я мог придумать, это что-то вроде:
template <typename P1, typename P2, typename FP1, typename FP2, typename T>
void g(T t, FP1 fp1, FP2 fp2, P1 p1, P2 p2)
{
fp1(t, p1);
...
fp2(t, p2);
...
}
template <typename T> void g1(T t)
{
g(t, f1<T, P1>, f2<T, P2>, P1{}, P2{});
}
Так что это слишком многословно, особенно с реальными типами, а не игрушечными, как в этом примере , Я должен отдельно передать каждую f()
специализацию, которая вызывается в обобщенной функции g()
, и я должен упомянуть каждый предикат дважды (во-первых, его тип в f-специализации, во-вторых, объект предиката в качестве отдельного параметра).
Если я уберу P1 p1, P2 p2
аргументы из g()
, мне все равно придется назвать его следующим образом: g<P1, P2>(t, f1<T, P1>, f1<T, P2>)
Есть ли способ сделать его проще и избежать повторений?
Я ограничен C ++ 11 / 14.