有效的C++:第41项 - 关于隐式接口的混淆

Ara*_*ash 4 c++ effective-c++

我正在阅读有效的C++,第41项,标题为"理解隐式接口和编译时多态性",它给出了这个例子,接下来是一个解释,但我不理解这一部分.

template<typename T>
void doProcessing(T& w)
{
     if (w.size() > 10 && w != someNastyWidget) {
     ...
Run Code Online (Sandbox Code Playgroud)

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

你能解释一下它的含义并举出更多例子吗?

Som*_*ude 12

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


让我们看看三个例子:

  1. 返回int:

    struct MyT
    {
        // Some stuff...
    
        int size()
        {
            return some_calculation_returning_int();
        }
    
        // Some more stuff...
    };
    
    Run Code Online (Sandbox Code Playgroud)
  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...
    };
    
    Run Code Online (Sandbox Code Playgroud)
  3. 返回其可与被比较的对象>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...
    };
    
    Run Code Online (Sandbox Code Playgroud)

虽然应该非常清楚可以使用第一种变体,但可以使用其他两种变体.这是因为他们以这种或那种方式返回可以与int价值相比较的东西.

如果我们"扩展"这三种变体:

  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. 运算符重载
  2. 用户定义的转换

  • 如果`它甚至不需要返回一个类型来定义运算符>是否有可能!`?我认为这是不明确的部分. (2认同)