4

我正在阅读 Effective C++,第 41 项,标题为“理解隐式接口和编译时多态性”,它给出了这个例子和接下来的解释,但我不明白这部分。

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

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

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

4

1 回答 1

12

这意味着该T::size()函数可以返回任何可以与值进行比较(使用>)的东西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. 返回一个可以与 a 进行比较的>对象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() > 10就像它一样。

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

  3. w.size() > 10w.size().operator>(10)。在这里,该MyOtherType::operator>()函数将用于比较本身。

参考

  1. 运算符重载
  2. 自定义转换
于 2018-08-22T07:16:48.607 回答