为什么这样做:
template <typename F>
struct getFnInfo;
template <typename RT, typename PT>
struct getFnInfo<RT(PT)>
{
typedef RT R;
typedef PT P;
};
但这并不是:
template <typename CT, typename RT, typename PT>
struct getFnInfo<RT (CT::)(PT)>
{
typedef CT C;
typedef RT R;
typedef PT P;
};
我的语法错了吗?
注意:这用于提取类型信息,如下所示:
int fn(double);
getFnInfo<decltype(fn)>::R // return type
getFnInfo<decltype(fn)>::P // parameter type
我知道还有其他方法可以做到这一点,但我很好奇是什么阻止了这种做法?这只是C ++中函数和成员函数之间另一个烦人的区别吗?
答案 0 :(得分:5)
C ++中有一个“函数”类型,但没有类型“成员函数”或“对成员函数的引用”。只有“指向成员函数的指针。”
因此, RT (CT::)(PT)
是句法无意义的。你需要RT (CT::*)(PT)
,指向成员函数的指针。
由于没有“成员函数”类型,甚至没有合法的方法来单独引用成员函数。如果您在班级f
中有成员函数C
,那么C::f
本身就会再次出错。您需要将其调用(something.f()
或C::f()
)或取其地址(&C::f
)。