【问题标题】:Returning member from struct without .get()从没有 .get() 的结构返回成员
【发布时间】:2020-04-01 12:51:54
【问题描述】:

假设我有以下结构

template<typenameT>
class Foo
{
  T value;
  public:
    // some public logic
}

在这一点上我想要的就是能够说出来

Foo<int> A;

然后从A 中获取值,就好像它知道“只是类型 T 的值”一样,并按如下方式使用它

int val1 = A;  // must correspond to int val1 = A.value
               // and
int& val2 = A; // must return reference of A.value and so on

我真的不想用户设置/获取,因为我会经常编写这样的调用并希望尽可能简化代码。

首先我认为重载 = 可能会有所帮助,但我没有做对。它与赋值运算符相反,例如Foo&lt;int&gt; A; int val = 1; A = val;

编辑:网上肯定已经有答案了,但我在“作业”关键字下找不到它。

【问题讨论】:

  • 你问的是user defined conversions吗?
  • 你能澄清一下:你为什么不使用 int ?你描述的很像一个;)。为什么没有get() 方法?为什么不公开value? (请注意,一旦您返回了对调用者的非常量引用,封装就已经被破坏了)
  • 在大多数情况下,定义隐式转换是一个非常糟糕的主意:您应该非常仔细地考虑是否值得对类型系统进行重大削弱(这会使您的代码更容易出错并且更难维持)。也就是说,在某些情况下这是有道理的。
  • @idclev463035818 我有额外的逻辑来跟踪变量的状态,例如bool is_set; 或变量的调用次数。 “没有得到”,因为我将在代码库中调用这个包装器一千次,并希望保持简单。
  • @user12700880 但是一旦你通过引用返回内部变量,你不会丢失那个跟踪吗?

标签: c++ assignment-operator


【解决方案1】:

您似乎想重载user-defined conversion 运算符:

template <typename T>
class Foo
{
  T value;
public:
    operator T () const { return value; }
    operator T& () { return value; }

    // some public logic
};

【讨论】:

  • 哦,是的,我按照自己的意愿实现了目的,但它没有遵循我希望的“超清晰”语法。因此,我认为从长远来看,正如康拉德鲁道夫在 cmets 中提到的那样,这种方法容易出错,而且还会增加样板的数量。 (尤其是当类型名称变得疯狂时,例如简单的std::vector&lt;double&gt; 已经让我一遍又一遍地写)。结果我可能会过度思考我的论点只是坚持旧好的.get();.set();,因为它们在代码编写的复杂性中是不变的;)
  • @user12700880 好奇:为什么这不遵循“超级清晰”的语法?
  • @idclev463035818 我认为int a = A(或者甚至auto a = A,如果很明显我没有复制A而是返回成员值)比auto a = (int)A更清晰.
  • @user12700880 你的假设是错误的(顺便说一句,在任何情况下你都不应该使用(int) 进行转换,但static_cast),这个答案中的转换是隐式的,不需要显式转换。 Fwiw,如果它们是明确的,上面 cmets 中概述的缺点就不是问题了。
  • @idclev463035818 谢谢,在这一点上我真的不知道隐式转换。现在我不再确定是否最好坚持set() get() 或使用用户定义的转换。顺便提一句。正如我在最初的帖子中提到的,簿记在代码中并不是什么大问题。我总是保存参数的状态(bool is_set;),并且在尚未实现的部分代码中,我可能会根据参数被其他函数“.get()`ed”(调用)的次数做一些逻辑。您的发言真的帮助我走得更远,谢谢。
猜你喜欢
  • 2019-07-28
  • 1970-01-01
  • 2011-12-19
  • 2023-03-25
  • 1970-01-01
  • 2013-05-23
  • 1970-01-01
  • 2013-06-24
相关资源
最近更新 更多