Мне не нравилась идея, которая достаточно проста в моей голове, но я не могу понять, как реализовать в 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
}
Насколько я знаю, я больше не могу печатать такой тип. Это явно делает вещи намного более неуклюжими, но я надеюсь, что есть еще способ.