我正在阅读有效的C ++,第41项,标题为“理解隐式接口和编译时多态性”,它给出了这个例子,接下来是一个解释,但我不理解这一部分。
template<typename T>
void doProcessing(T& w)
{
if (w.size() > 10 && w != someNastyWidget) {
...
...,T必须支持一个size成员函数,.....,但是这个成员函数不需要返回一个整数类型。它甚至不需要返回数字类型。就此而言,它甚至不需要返回定义了运算符
>
的类型!它需要做的就是返回一个x类型的对象,这样就可以调用一个运算符>
,类型为x的对象和一个int ...
你能解释一下它的含义并举出更多例子吗?
这意味着T::size()
函数可以返回任何可以比较的值(使用>
)到int
值。
让我们看看三个例子:
int
:
struct MyT
{
// Some stuff...
int size()
{
return some_calculation_returning_int();
}
// Some more stuff...
};
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...
};
>
比较的对象到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
值进行比较的东西。
如果我们“扩展”这三种变体:
w.size() > 10
就像它一样。w.size() > 10
将是w.size().operator int() > 10
。这里MySizeType::operator int()
转换函数将用于将MySizeType
对象转换为可以比较的int
值。w.size() > 10
将是w.size().operator>(10)
。这里MyOtherType::operator>()
函数将用于比较本身。参考