免责声明:标准可能禁止我尝试做的事情,如果是,请告诉我。
我试图在定义方法的类的范围内使用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);
};
答案 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
};