我对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 的成员。或者不是?
答案 0 :(得分: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
当然,您可以将成员指针作为函数参数提供,并让编译器为您推导出类型参数。