【问题标题】:Accessing data members of a data member(itself is object) as if they were class members访问数据成员(本身是对象)的数据成员,就好像它们是类成员一样
【发布时间】:2018-10-15 06:49:04
【问题描述】:

鉴于场景,

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;
}

我想访问以下数据成员:

int main(){
    A<true> object_1;
    A<false> object_2;
    cout << object_1.x;
    cout << object_2.k;
}

如果.(dot) 运算符可以重载,这将是可能的。但是,这是不可能的(至少现在是这样)。是否有解决方法可以使示例正常工作?

【问题讨论】:

  • A 中创建引用子对象成员的引用成员?
  • struct b 不会保持不变。它可以是另一个结构,在 A 中声明,并且具有不同数量的不同类型的数据成员。我将对其进行更新以使其更加具体。 (示例更新)
  • 能够重载. 运算符将是完美的。
  • 如果解决方案增加了A 的大小并且以这种方式使用成员的效率不如直接访问成员的效率那么高,是否可以?
  • @aschepler 结构大小或效率不是问题。在这一点上,我需要简洁的语法。

标签: c++ operator-overloading overloading


【解决方案1】:

你不能超载.,这是正确的。但是,您可以重载-&gt;,如果这也是您的选择吗?

operator-&gt; 必须返回一个本身支持operator-&gt; 的类型,例如一个原始指针适合这个:

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; }
};

你可以这样使用它:

int main()
{ 
    A<true> object_1; 
    A<false> object_2; 
    cout << object_1->x; 
    cout << object_2->k;
}

【讨论】:

  • 最好是. 语法。
  • @nmd_07 好吧,正如您自己所说,这是不可能的。请问为什么-&gt; 不适合你?您是否使用A 作为指针?
  • 使用.操作符会更方便。
【解决方案2】:

似乎比我想象的要容易:

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{

}

【讨论】:

    猜你喜欢
    • 2022-01-10
    • 1970-01-01
    • 2015-04-22
    • 1970-01-01
    • 1970-01-01
    • 2021-05-20
    • 2021-10-05
    • 2015-04-01
    • 1970-01-01
    相关资源
    最近更新 更多