С++, указатель на указатель функции шаблона
У меня есть указатель на общий статический метод
class MyClass
{
private:
static double ( *pfunction ) ( const Object *, const Object *);
...
};
указывающий на статический метод
class SomeClass
{
public:
static double getA ( const Object *o1, const Object *o2);
...
};
Инициализация:
double ( *MyClass::pfunction ) ( const Object *o1, const Object *o2 ) = &SomeClass::getA;
Я хотел бы преобразовать этот указатель в указатель статической функции шаблона:
template <class T>
static T ( *pfunction ) ( const Object <T> *, const Object <T> *); //Compile error
где:
class SomeClass
{
public:
template <class T>
static double getA ( const Object <T> *o1, const Object <T> *o2);
...
};
Но существует следующая ошибка компиляции:
error: template declaration of : T (* pfunction )(const Object <T> *o1, const Object <T> *o2)
Спасибо за вашу помощь...
Ответы
Ответ 1
Во втором случае getA
больше не является функцией, а является шаблоном функции, и вы не можете иметь указатель на функциональный шаблон.
Что вы можете сделать, это указать pfunction
на конкретный экземпляр getA
(то есть: для T = int
):
class MyClass
{
static double (*pfunction)(const Object<int> *, const Object<int> *);
};
double (*MyClass::pfunction)(const Object<int> *o1, const Object<int> *o2) = &SomeClass::getA<int>;
Но я не думаю, что есть способ получить pfunction
для указания на любой возможный экземпляр getA
.
Ответ 2
шаблон : он не является конкретным типом и не может использоваться как член. например вы не можете определить следующий класс:
class A
{
template <class T> std::vector<T> member;
}
потому что template <class T> std::vector<T> member;
- это то, что потенциально может быть специализировано для разных типов. вы можете сделать что-то вроде этого:
template <class T>
struct A
{
static T (*pfunction)();
};
struct B
{
template <class T>
static T getT();
};
int (*A<int>::pfunction)() = &B::getT<int>;
здесь A<int>
является специализированным шаблоном и поэтому имеет специализированный член
Ответ 3
template <class T>
static T ( *pfunction ) ( const Object <T> *, const Object <T> *);
Шаблон указателя функции является незаконным в С++. Будьте внутри класса или просто вне класса. Вы не можете написать это (даже вне класса):
template <class X>
void (*PtrToFunction) (X);
Смотрите этот образец: http://www.ideone.com/smh73
Стандарт С++ говорит в $14/1,
Шаблон определяет семейство классовили .
Обратите внимание, что он НЕ говорит: "Шаблон определяет семейство классов, функций или указателей функций". Итак, что вы пытаетесь сделать, это определение "семейства указателей функций" с использованием шаблона, который не разрешен.
Generic Functors из Loki библиотека будет элегантным решением проблемы, с которой вы сталкиваетесь.: -)
Ответ 4
Одна вещь, которую вы можете сделать, это иметь копию функции члена шаблона в файле cpp и указать на то, что i.e
template <+typename ElementType>
int PQueueHeap<ElementType>::compareFunction(ElementType First,ElementType Second)
{
if (First>Second) return 1; else if (First==Second) return 0; else return -1;
}
// you cannot point to above
однако вы можете указать
template <+typename ElementType>
int compareFunction(ElementType First,ElementType Second)
{
if (First>Second) return 1; else if (First==Second) return 0; else return -1;
} // No error and it works!