Я в основном ищу для создания обертки для общей функции C без необходимости вручную указывать типы. Поэтому у меня есть обратный вызов с фиксированным прототипом, но мне нужно будет сделать специальный код в оболочке на основе типа завернутой функции ... Поэтому в основном я думаю об использовании статического метода в шаблоне класса обернуть функцию в соответствующем интерфейсе, например:Параметр непигового шаблона ... это шаблон! (C++)
// this is what we want the wrapped function to look like
typedef void (*callback)(int);
void foobar(float x); // wrappee
// doesn't compile
template< T (*f)(S) > // non-type template param, it's a function ptr
struct Wrapper
{
static void wrapped(int x)
{
// do a bunch of other stuff here
f(static_cast<S>(x)); // call wrapped function, ignore result
}
}
и тогда я хотел бы сделать что-то вроде:
AddCallback(Wrapper<foobar>::wrapped);
Однако, проблема в том, что я не могу просто идти вперед и использовать «S» в параметре функции в шаблоне Wrapper, я должен сначала перечислить его как параметр:
template< class T, class S, T (*f)(S) >
struct Wrapper
// ...
Но это означает, что гораздо больнее использовать (Wrapper<void,float,foobar>::wrapped
), в идеале я хотел бы просто передать указатель функции там, и он автоматически будет обрабатывать типы параметров (и возвращаемых типов). Чтобы быть ясным, внутри завернутой функции мне нужно будет обратиться к типам указателя функции (так что мне нужен какой-то эквивалент S или T).
Есть ли способ сделать это?
@damndirtyape: Я думал о вашем вопросе, и я думаю, что сделал что-то подобное. К сожалению, это связано с большим количеством кода. В основном, у моего решения был базовый класс, который перегружал operator(), и у меня были заводские функции, которые построили базовые классы, основанные на переданном типе функции. Если вам нравится, я могу разместить код в пастебине где-нибудь. –