我一直在努力反对一个在我脑海中足够简单的想法,但我不知道如何在 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
我也尝试了上面的简单变体,例如将返回类型括在括号中,但所有这些想法也都失败了。
有谁知道声明转换为函数指针运算符方法的语法是什么,或者是否有可能这样做?
注意:我使用 GCC 4.5.2 使用 Code::Blocks 编译它。也欢迎涉及一些新的 C++0x 概念的答案。
编辑
在我努力简化示例的过程中,我无意中遗漏了一个细节。这有点奇怪,但不是严格地返回一个int(*)(int,int)
指针,转换运算符旨在模板化:
template<typename ReturnType, typename ArgType1, typename ArgType2>
operator ReturnType(*)(ArgType1, ArgType2) ( ) const
{
// implementation is unimportant here
}
据我所知,我不再可以 typedef 这样的类型。这显然使事情变得更加笨拙,但我希望仍有办法。