У меня есть некоторые шаблоны функций, например
template <typename T>
void foo(T);
template <typename T>
void bar(T);
// others
и мне нужно передать каждый алгоритм, который будет называть его различными типами, например
template <typename F>
void some_algorithm(F f)
{
// call f with argument of type int
// call f with argument of type SomeClass
// etc.
}
Я не могу передать в свой шаблон функции uninstantiated, но я не могу создать экземпляр с любым конкретным типом, потому что some_algorithm
нужно будет вызвать его с аргументами нескольких разных типов.
Я мог бы адаптировать мои функциональные шаблоны к объектам полиморфной функции, например
struct foo_polymorphic
{
template <typename T>
void operator()(T t)
{
foo(t);
}
};
а затем передайте его как some_algorithm(foo_polymorphic())
. Но для этого требуется написать отдельный адаптер для каждого из моих шаблонов функций.
Существует ли общий способ адаптации шаблона функции к объекту полиморфной функции, то есть к некоторому механизму, который я могу повторно использовать для каждого из шаблонов функций, которые мне нужно адаптировать, без необходимости объявить что-то отдельно для каждого?