在课堂上指向成员的指针

时间:2012-07-07 17:43:38

标签: c++ visual-c++ c++11 visual-studio-2012 template-meta-programming

我正在尝试为类中创建一个需要指向成员指针的模板的typedef。描述它的最佳方式是显示最小样本代码:

template<typename T, int T::*MV>
struct Bar
{
    const int &value(const T &t) const
    {
         return (t.*MV);
    }
};

struct Foo
{
    int baz;

    typedef Bar<Foo, &Foo::baz> GetBaz; // Compiler error
};

typedef Bar<Foo, &Foo::baz> GetFooBaz; // Compiles just fine

int main(int argc, char* argv[])
{
    Foo f = { 42 };
    Foo::GetBaz b; // Fails to compile
    GetFooBaz b2; // Fine

    int val = b.value(f); // Fails to compile because of above
    int val2 = b2.value(f); // Fine
}

我不一定会以这种方式访问​​成员指针,只要知道变量的偏移并让Bar :: value函数执行欺骗就可以了。

作为最后的手段,我想我可以使用traits类,因为它会将定义移到类之外,但我更希望能够在正在使用的变量附近声明typedef。

而且,为了回答“你为什么要这样做”的问题,这就是一个IoC容器,它代表了MEF(C#的工作方式)。

我使用的特定编译器是VC12,但如果VC11支持它也会很好。

由于

编辑:

以下是错误消息

1&gt; ------ Build build:项目:MemVarBug,配置:调试Win32 ------ 1 GT; MemVarBug.cpp 1&gt; memvarbug.cpp(20):错误C2327:'Foo :: baz':不是类型名称,静态或枚举器 1&gt; memvarbug.cpp(20):错误C2065:'baz':未声明的标识符 1&gt; memvarbug.cpp(20):错误C2975:'MV':'Bar'的模板参数无效,预期的编译时常量表达式 1 GT; memvarbug.cpp(7):看'MV'的声明 ==========构建:0成功,1个失败,0个最新,0个跳过==========

1 个答案:

答案 0 :(得分:0)

您可以执行以下操作: 宣布baz为int [1]; 大小为1的数组,在这种情况下,调用baz将返回指针并调用* baz将返回值。