Вместо этого используйте std::function
или реализацию Boost, если у вашего компилятора еще нет TR1. Тем не менее, это специализация, которую вы ищете указатель на функции-члены:
template<typename T, typename C, typename U, typename V>
class wrapper<T (C::*)(U,V)>
{
private:
//typedef pointer to member-function
typedef T (C::*pfn)(U,V);
pfn f;
public:
wrapper(pfn func):f(func)
{
};
T operator()(C c, U a, V b)
{
return (c.*f)(a,b);
}
};
и его экземпляр, подобный этому:
wrapper< double(someClass::*)(double, double) > somewrapper;
Первое создание, которое вы дали, не является невозможным, но для его работы требуется огромное количество стираемых типов, поскольку тип класса не может быть выведен из аргумента конструктора.
wrapper<double(double, double)> somewrapper( &someClass, &someClass::someFunction)
Второй можно заставить работать, немного изменив мой пример кода, предполагая, что вы хотите создать его экземпляр только с указателем на функции-члены.
wrapper<double(someClass*, double)> somewrapper( &someClass::someFunction)
Предполагая, что вы хотите, чтобы одно определение обертки могло использоваться как для свободных функций, так и для функций-членов с совместимыми аргументами, вам снова потребуется некоторое стирание типов, чтобы оно работало. Реализация Boost.Function
фактически использует другую технику, чтобы избежать вызовов virtual
.