【问题标题】:Effective C++: Item 41 - confusion about Implicit interfacesEffective C++: Item 41 - 关于隐式接口的混淆
【发布时间】:2018-08-22 07:13:58
【问题描述】:

我正在阅读 Effective C++,Item 41,标题为“Understanding implicit interfaces and compile-time polymorphism”,它给出了这个例子和接下来的解释,但我不明白这部分。

template<typename T>
void doProcessing(T& w)
{
     if (w.size() > 10 && w != someNastyWidget) {
     ...

...,T 必须支持一个 size 成员函数,......,但是这个成员函数不需要返回一个整数类型。它甚至不需要返回数字类型。就此而言,它甚至不需要返回定义了运算符&gt; 的类型!它需要做的就是返回一个 x 类型的对象,这样就有一个操作符 &gt; 可以用 x 类型的对象和一个 int 来调用...

您能否解释一下它的含义并提供更多示例?

【问题讨论】:

  • 哪部分解释不清楚?
  • 这被称为duck typingw.size() 不需要是任何东西,只是 w.size() &gt; 10 需要转换为 bool
  • @UnholySheep 从“那件事,...”到结尾是很模糊的。
  • 我想作者只是想强调,虽然当我们看到size() 时我们有一定的期望(例如,我们假设它返回一个整数类型),但真正需要的是@987654329 @ 是这样的,这一行编译没有错误

标签: c++ effective-c++


【解决方案1】:

这意味着T::size() 函数可以返回任何可以比较(使用&gt;)与int 值的值。


让我们看三个例子:

  1. 返回int

    struct MyT
    {
        // Some stuff...
    
        int size()
        {
            return some_calculation_returning_int();
        }
    
        // Some more stuff...
    };
    
  2. 返回一个可以转换为int的对象:

    struct MySizeType
    {
        // Some stuff...
    
        operator int()
        {
            return some_calculation_returning_int();
        }
    
        // Some more stuff...
    };
    
    struct MyT
    {
        // Some stuff...
    
        MySizeType size()
        {
            return MySizeType();
        }
    
        // Some more stuff...
    };
    
  3. 将可与&gt; 比较的对象返回到int

    struct MyOtherSizeType
    {
        // Some stuff...
    
        operator>(int other)
        {
            return some_calculation_returning_int() > other;
        }
    
        // Some more stuff...
    };
    
    struct MyT
    {
        // Some stuff...
    
        MyOtherSizeType size()
        {
            return MyOtherSizeType();
        }
    
        // Some more stuff...
    };
    

虽然可以使用第一个变体应该很清楚,但其他两个变体也可以使用。这是因为它们以一种或另一种方式返回可以与 int 值进行比较的东西。

如果我们“扩展”这三个变体:

  1. w.size() &gt; 10 就是这样。

  2. w.size() &gt; 10 将是 w.size().operator int() &gt; 10。这里将使用MySizeType::operator int() 转换函数将MySizeType 对象转换为可以比较的int 值。

  3. w.size() &gt; 10 将是 w.size().operator&gt;(10)。这里MyOtherType::operator&gt;()函数将用于比较本身。

参考

  1. operator overloading
  2. user-defined conversion

【讨论】:

  • 如果it need not even return a type for wich operator&gt; is defined!可以吗?我认为这是不清楚的部分。
  • @Federico Case 2 具有该属性。
  • @Federico 在您的评论后添加了一些示例。
  • @FantasticMrFox 发表评论时没有。
  • @Someprogrammerdude 我看到了,我发表评论只是为了指出操作想要(也许)理解的内容,我已经+1ed 你的答案了;)
猜你喜欢
  • 1970-01-01
  • 2021-09-20
  • 2011-04-11
  • 1970-01-01
  • 2016-08-18
  • 2014-01-10
  • 2014-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多