Оператор преобразования C ++ для преобразования в указатель на функцию

Я ломаю голову против идеи, которая в моей голове достаточно проста, но я не могу понять, как реализовать на 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.

Edit

В моем стремлении упростить пример я случайно упустил одну деталь. Это немного странно, но вместо того, чтобы строго возвращать указатель int (*) (int, int) , оператор преобразования предназначен для создания шаблона:

template<typename ReturnType, typename ArgType1, typename ArgType2>
operator ReturnType(*)(ArgType1, ArgType2) ( ) const
{
    // implementation is unimportant here
}

Насколько мне известно, я больше не могу typedef такой тип. Это явно делает вещи более неуклюжими, но я надеюсь, что способ все же есть.

24
задан Ken Wayne VanderLinde 23 July 2011 в 01:07
поделиться