【问题标题】:Is there a way to force auto deduction to consider operator <some_type>() over copy assignment?有没有办法强制自动推断考虑运算符 <some_type>() 而不是复制分配?
【发布时间】:2016-11-11 10:13:00
【问题描述】:

我有一个变量包装器,当通过这个包装器修改底层变量时,它会发出更改信号,因此其他对象可以监听更改。

它工作正常(即我可以在底层对象上分配、加、减、调用成员函数(尽管这些函数无法发出更改信号)等),但有一点小问题:如果我这样做了

struct some_object_type
{
  wrapper<int> some_wrapper;
}

int main()
{
  some_object_type some_object;
  auto value = some_object.some_wrapper;
}

value 这里被正确推断为wrapper&lt;int&gt;。有什么方法可以让这个结构表现得好像some_object.some_wrapperint 类型,所以value 被推导出为int 变量?

【问题讨论】:

  • some_wrapper 不是int 时,为什么要将其类型推导出为int
  • 你可以delete some_wrapper 的复制构造函数并将隐式转换运算符写入T。这对你来说合理吗?
  • auto value = ... 是复制构造的示例,而不是赋值。

标签: c++ c++14 auto type-deduction conversion-operator


【解决方案1】:

@TartanLlama 在他的评论中有正确的解决方案。但是,如果您指定了auto const&amp; value = ...,您希望auto 推断出什么?在这种情况下,隐式转换将不起作用。

我之前遇到过这个问题,我能想到的最好的解决方案是提供一个wrapper&lt;T&gt;::operator() 函数:

struct some_object_type
{
  wrapper<int> some_wrapper;
}

int main()
{
  some_object_type some_object;
  auto value1 = some_object.some_wrapper;  // deduces to wrapper<int>
  auto value2 = some_object.some_wrapper(); //deduces to int      
}

也许不是您希望的解决方案,但除非您放弃自动类型推断,否则您最好的办法是@TartanLlama 的建议。

【讨论】:

    猜你喜欢
    • 2011-01-17
    • 2015-04-02
    • 1970-01-01
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    • 2019-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多