2

我对 C++ 中的模板有理论问题。
假设我有以下代码:

代码

struct C{
   int val = 15;
};

struct B{
    C c;
    int k = 9;
};

struct A{
    template<typename T, typename FType, FType T::* Field = nullptr>
    void test(T& d){
        if (Field != nullptr){
            int a = d.*Field;
        }
    }
};


int main(int argc, char *argv[])
{

    A a;
    B be;

    a.test<B, int, &B::c::val>(be);
    //a.test<B, int, &B::k>(be);
}

问题是:当我可以访问B::k时,为什么我不能访问B::c::val字段?B::c::val也是B的成员。或不?

4

1 回答 1

1

B::c是 的 成员B,C::val是 的 成员C, 但没有类似的B::c::val

你想要在这里做的可以这样实现:

struct A {
  template<typename T, typename OType, typename IType, OType T::* OField = nullptr, IType OType::* IField = nullptr>
  void test(T& d){
    if (OField != nullptr && IField != nullptr) {
      auto a = d.*OField.*IField; 
    }
  }
};

int main(int argc, char *argv[])
{

    A a;
    B be;

    a.test<B, C, int, &B::c, &C::val>(be);
}

http://coliru.stacked-crooked.com/a/f89b96274218e223

当然,您可以提供成员指针作为函数参数,让编译器为您推导出类型参数。

于 2013-11-28T09:42:57.163 回答