Я ломаю голову против идеи, которая в моей голове достаточно проста, но я не могу понять, как реализовать на C ++ .
Обычно я могу объявить класс с оператором преобразования, как в этом простом примере:
class Foo
{
private:
int _i;
public:
Foo( int i ) : _i(i) { }
operator int( ) const
{
return i;
}
};
Итак, теперь я могу писать потрясающие вещи вроде
int i = Foo(3);
Но в моем конкретном случае я хотел бы предоставить оператор для преобразования объект в указатель функции (например, преобразование экземпляра Bar
в указатель на функцию int (*) (int, int)
). Вот что я сначала пробовал:
class Bar
{
private:
int (*_funcPtr)(int, int);
public:
Bar( int (*funcPtr)(int, int) ) : _funcPtr(funcPtr) { }
operator int(*)(int, int) ( ) const
{
return _funcPtr;
}
};
Но операторная функция не компилируется, и возникают следующие ошибки:
expected identifier before '*' token
'<invalid-operator>' declared as a function returning a function
Я также пробовал простые варианты вышеперечисленного, например, заключив возвращаемый тип в круглые скобки, но все эти идеи имеют также не удалось.
Кто-нибудь знает, каков синтаксис для объявления метода оператора преобразования в указатель на функцию, и возможно ли это вообще?
Примечание: я компилирую это с помощью Code :: Blocks используя GCC 4.5.2. Также приветствуются ответы на некоторые из новых концепций C ++ 0x.
В моем стремлении упростить пример я случайно упустил одну деталь. Это немного странно, но вместо того, чтобы строго возвращать указатель int (*) (int, int)
, оператор преобразования предназначен для создания шаблона:
template<typename ReturnType, typename ArgType1, typename ArgType2>
operator ReturnType(*)(ArgType1, ArgType2) ( ) const
{
// implementation is unimportant here
}
Насколько мне известно, я больше не могу typedef такой тип. Это явно делает вещи более неуклюжими, но я надеюсь, что способ все же есть.