嵌套数据成员指针 - 不可能?

Ole*_*ann 10 c++ member-pointers

愚蠢的简化代码示例没有做任何有用的事情,而是对数据成员指针的两个后续分配.第一个分配工作,第二个分配给出编译器错误.大概是因为它是一个嵌套的成员.

问题是:是否真的不可能让成员指针指向嵌套成员,或者我错过了任何花哨的语法?

struct Color {
    float Red;
    float Green;
    float Blue; };


struct Material {
    float Brightness;
    Color DiffuseColor; };


int main() {
    float Material::* ParamToAnimate;
    ParamToAnimate = &Material::Brightness;       // Ok
    ParamToAnimate = &Material::DiffuseColor.Red; // Error! *whimper*
    return 0; }
Run Code Online (Sandbox Code Playgroud)

ATM我通过使用字节偏移和大量演员来解决.但这很难看,我最好使用那些成员指针.

是的,我知道之前肯定会出现这个问题(几乎与任何问题一样).是的,我事先搜查过但发现没有令人满意的答案.

谢谢你的时间.

jpa*_*cek 6

AFAIK,这是不可能的。指向成员的指针只能由 type 的表达式形成&qualified_id,这不是你的情况。

Vite Falcon的解决方案可能是最合适的。


Nav*_*een 5

我假设您正在尝试获取指向数据库的指针Red.由于这是在结构中定义的Color,因此指针的类型是Color::*.因此,您的代码应该是:

int main() {
    float Color::* ParamToAnimate;
    ParamToAnimate = &Color::Red; 
    return 0; }
Run Code Online (Sandbox Code Playgroud)

要使用它,您需要将其绑定到例如的Color实例:

void f(Color* p, float Color::* pParam)
{
    p->*pParam = 10.0;
}
int main() {
    float Color::* ParamToAnimate;
    ParamToAnimate = &Color::Red; 

    Material m;
    f(&m.DiffuseColor, ParamToAnimate);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编辑:是不是可以使动画功能成为模板?例如:

template<class T>
void f(T* p, float T::* pParam)
{
    p->*pParam = 10.0;
}
int main() {

    Material m;

    f(&m.DiffuseColor, &Color::Red);
    f(&m, &Material::Brightness);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)