在类范围内采用虚方法的类型

时间:2016-11-11 09:12:23

标签: c++ c++11 visual-studio-2013

免责声明:标准可能禁止我尝试做的事情,如果是,请告诉我。

我试图在定义方法的类的范围内使用decltype获取虚方法(指针)的类型。这适用于GCC,但很难崩溃Visual Studio 2013:

class foo
{
public:
    virtual void bar() = 0;

    // typedef decltype(&foo::bar) bar_pointer; // crashes VS2013 (error C1001: An internal error has occurred in the compiler)

};
typedef decltype(&foo::bar) bar_pointer; // works fine with VS2013

由于种种原因,我需要班级中的类型,所以我试图解决这个崩溃问题。有趣的是,以下编译VS2013:

class foo
{
public:
    virtual void bar() = 0;

    typedef decltype(foo::bar) bar_pointer; // works in VS2013, GCC complains(invalid use of non-static member function)
};

此处,bar_pointer的类型显示为void __thiscall foo::(void)。对我来说没有多大意义,我想这是一种错误的类型。然而,我尝试将此类型转换为有效的方法指针类型,方法是将其传递给提取返回类型和参数类型的模板特化。但似乎这种奇怪的类型与我能想到的任何专业化都没有匹配。

有没有人知道这里发生了什么,或者可以想办法解决这个问题?

更新

似乎这与decltype没有直接关系,而是与一般的无评估背景有关。以下也崩溃了:

class foo
{
public:
    virtual void bar() = 0;

    static const size_t test = sizeof(&foo::bar);
};

1 个答案:

答案 0 :(得分:0)

首先,它适用于GCC / Clang:

struct Foo {
    virtual void bar() = 0;
    using baz = decltype(&Foo::bar);
};

所以它看起来像MSVC ++ bug / pecularity(成员函数指针类型取决于类属性)。 解决这个问题的一种方法是提前声明虚拟类“接口”:

struct IFoo {
    virtual void bar() = 0;
};
struct Foo : public virtual IFoo {
    using baz = decltype(&Foo::bar); // note, it works with Foo member function pointer now
};