Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 像访问类成员一样访问数据成员(本身是对象)的数据成员_C++_Operator Overloading_Overloading - Fatal编程技术网

C++ 像访问类成员一样访问数据成员(本身是对象)的数据成员

C++ 像访问类成员一样访问数据成员(本身是对象)的数据成员,c++,operator-overloading,overloading,C++,Operator Overloading,Overloading,鉴于这种情况 template <bool T> struct A{ struct B{ int x; double y; } struct C{ char c; std::string k; } using type = std::conditional<T, B, C>::type; type b; } 模板 结构A{ 结构B{ int x; 双y; } 结构C{ 字符c;

鉴于这种情况

template <bool T>
struct A{
    struct B{
       int x; 
       double y;
    }
    struct C{
       char c;
       std::string k;
    }
 using type = std::conditional<T, B, C>::type;
 type b;
}
模板
结构A{
结构B{
int x;
双y;
}
结构C{
字符c;
std::字符串k;
}
使用type=std::conditional::type;
b型;
}
我希望访问以下成员的数据:

int main(){
    A<true> object_1;
    A<false> object_2;
    cout << object_1.x;
    cout << object_2.k;
}
intmain(){
对象_1;
对象_2;

您不能重载
,这是正确的。但是,您可以重载
->
,如果这也是您的一个选项

运算符->
必须返回本身支持
运算符->
的类型,例如,原始指针适合以下情况:

template <bool T> struct A
{
    struct B
    {
        int x; 
        double y; 
    }; 
    struct C
    { 
        char c; 
        std::string k;
    };
    using type = std::conditional<T, B, C>::type;
    type b;

    type* operator->() { return &b; }
};
模板结构A
{
结构B
{
int x;
双y;
}; 
结构C
{ 
字符c;
std::字符串k;
};
使用type=std::conditional::type;
b型;
类型*运算符->(){return&b;}
};
您可以这样使用它:

int main()
{ 
    A<true> object_1; 
    A<false> object_2; 
    cout << object_1->x; 
    cout << object_2->k;
}
intmain()
{ 
对象_1;
对象_2;
cout x;
库特k;
}

似乎比我想象的要容易:

struct B{
    int x; 
    double y;
}
struct C{
   char c;
   std::string k;
}
template <bool T>
struct A : public std::conditional <T, B, C>::type{

}
结构B{ int x; 双y; } 结构C{ 字符c; std::字符串k; } 样板 结构A:public std::conditional::type{ }
a
中创建一个引用子对象成员的引用成员?结构b不会保持不变。它可以是另一个结构,在a中声明,并且具有不同类型的不同数量的数据成员。我将对其进行更新,使其更具体。(示例已更新)具有重载
运算符的能力将是完美的。如果解决方案增加了
A
的大小,并且以这种方式使用成员的效率不如直接成员访问那么高,那么可以吗?@aschepler struct size或efficiency不是一个问题。此时我需要的是语法的简单性。更好ode>语法。@nmd_07好吧,正如你自己说的,这是不可能的。我可以问一下为什么
->
对你不起作用吗?你用
A
作为指针吗?使用
操作符会更方便。