为什么没有成员函数签名与函数签名具有相同的规范?

时间:2015-08-12 13:19:58

标签: c++ templates template-meta-programming

为什么这样做:

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 ++中函数和成员函数之间另一个烦人的区别吗?

1 个答案:

答案 0 :(得分:5)

C ++中有一个“函数”类型,但没有类型“成员函数”或“对成员函数的引用”。只有“指向成员函数的指针。”

因此,

RT (CT::)(PT)是句法无意义的。你需要RT (CT::*)(PT),指向成员函数的指针。

由于没有“成员函数”类型,甚至没有合法的方法来单独引用成员函数。如果您在班级f中有成员函数C,那么C::f本身就会再次出错。您需要将其调用(something.f()C::f())或取其地址(&C::f)。