1

我正在尝试从类中为需要指向成员的指针的模板创建 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 函数执行诡计就可以了。

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

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

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

谢谢

编辑:

这是错误消息

1>----- 构建开始:项目:MemVarBug,配置:调试 Win32 ------ 1> MemvarBug.cpp 1>memvarbug.cpp(20): error C2327: 'Foo::baz' : is不是类型名称、静态或枚举数 1>memvarbug.cpp(20): error C2065: 'baz' : undeclared identifier 1>memvarbug.cpp(20): error C2975: 'MV' : 'Bar' 的模板参数无效, 预期的编译时常量表达式 1> memvarbug.cpp(7) : 见 'MV' 的声明 ========== 构建: 0 成功, 1 失败, 0 最新, 0 跳过 = =========

4

1 回答 1

0

您可以执行以下技巧:将 baz 声明为 int[1]; 大小为 1 的数组,在这种情况下,调用 baz 将返回指针,调用 *baz 将返回值。

于 2012-07-07T17:49:44.327 回答