- 主题:请教个问题
#include <iostream>
class A {
public:
A(int a) : data_(a) {};
private:
int data_ = 0;
};
template <typename PtrType>
struct Access {
inline static PtrType ptr;
};
template <auto V>
struct PtrTaker {
struct Transferer {
Transferer() {
Access<decltype(V)>::ptr = V;
}
};
static Transferer tr;
};
template struct PtrTaker<&A::data_>;
int main() {
A a{10};
std::cout << a.*Access<int A::*>::ptr << std::endl;
return 0;
}
a.*Access<int A::*>::ptr 是如何将a::data_的值或者地址 赋值给Access<int A::*>::ptr
这块没想明白,谢谢
--
FROM 39.155.212.*
感谢回复
p = Access<int A::*>::ptr; // Access<int A::*>::ptr 是在静态成员tr的构造里初始化好的
在这句里面,是不是可以理解为把a.data_ 的地址 赋值给Access<int A::*>::ptr
模板这种用法第一次见,谷歌也没搜到这种解释,即通过对象 调用 一个 不属于其的成员函数(本例为Access类)
或者说,编译器是怎样做的,能将a::data_的地址 传给Access里面
【 在 z16166 的大作中提到: 】
: 感觉属于奇技淫巧吧
: 这句定义了一个偏特化后的类型,它有个静态成员tr
: template struct PtrTaker<&A::data_>;
: ...................
--
修改:namelij FROM 39.155.212.*
FROM 39.155.212.*
嗯嗯,感谢大佬
【 在 z16166 的大作中提到: 】
: 试了一下,把tr也加上inline,gcc就也输出10了
: inline static Transferer tr;
: 而且加了inline后,msvc的行为也变了,可以在Transfer的构造那里设断点断下来,在main()之前构造,符合预期。
: ...................
--
FROM 39.155.212.*