Ken*_*nde 24 c++ function-pointers conversion-operator
我一直在反对一个简单易懂的想法,但我无法弄清楚如何用C++实现.
通常,我可以使用转换运算符声明一个类,如下例所示:
class Foo
{
private:
int _i;
public:
Foo( int i ) : _i(i) { }
operator int( ) const
{
return i;
}
};
Run Code Online (Sandbox Code Playgroud)
所以现在我可以写出很棒的东西了
int i = Foo(3);
Run Code Online (Sandbox Code Playgroud)
但在我的特定情况下,我想提供一个操作符,用于将对象转换为函数指针(例如,将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;
}
};
Run Code Online (Sandbox Code Playgroud)
但是运算符函数无法编译,生成这些错误:
expected identifier before '*' token
'<invalid-operator>' declared as a function returning a function
Run Code Online (Sandbox Code Playgroud)
我也尝试过上面的简单变体,比如在括号中包含返回类型,但所有这些想法也都失败了.
有谁知道声明转换为函数指针操作符方法的语法是什么,或者是否有可能这样做?
注意:我正在使用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
}
Run Code Online (Sandbox Code Playgroud)
据我所知,我不再无法输入这样的类型.这显然使事情变得更加笨拙,但我希望还有一种方法.
Ker*_* SB 17
既然你必须知道:
(*operator int() const)(int, int)
{
return _funcPtr;
}
Run Code Online (Sandbox Code Playgroud)
(固定.再次.)
更新: Johannes Schraub和Luc Danton告诉我,这种语法实际上是无效的,你必须使用typedef.既然你说typedef不是一个选项,这里有一个可以包装你的typedef的助手类:
template<typename R, typename A1, typename A2>
struct MakeFunctionType
{
typedef R(*type)(A1, A2);
};
template<typename R, typename A1, typename A2>
operator typename MakeFunctionType<R, A1, A2>::type () const
{
// implementation is unimportant here
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7209 次 |
| 最近记录: |