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

问题描述 投票:4回答:1

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

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

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

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

c++ effective-c++
1个回答
12
投票

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


让我们看看三个例子:

  1. 返回intstruct 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. 返回一个可以与>比较的对象到intstruct 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() > 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
© www.soinside.com 2019 - 2024. All rights reserved.