Effective C++: Item 41 - 对隐式接口的混淆

Effective C++: Item 41 - confusion about Implicit interfaces

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

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

..., T must support a size member function, ....., But this member function need not return an integral type. It need not even return a numeric type. For that matter, it need not even return a type for which operator > is defined! All it needs to do is return an object of some type x such that there is an operator > that can be called with and object of type x and an int ...

你能解释一下它是关于什么的,并举更多的例子吗?

这意味着 T::size() 函数可以 return 任何可以与 int 值进行比较(使用 >)的东西。


让我们看三个例子:

  1. Return 一个 int:

    struct MyT
    {
        // Some stuff...
    
        int size()
        {
            return some_calculation_returning_int();
        }
    
        // Some more stuff...
    };
    
  2. Return 可以转换为 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. Return 可以用 >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...
    };
    

虽然第一个变体可以使用应该很清楚,但其他两个变体可以使用。那是因为它们以某种方式 return 可以与 int 值进行比较。

如果我们"expand"三种变体:

  1. w.size() > 10就是这样。

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

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

参考

  1. operator overloading
  2. user-defined conversion