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
值进行比较(使用 >
)的东西。
让我们看三个例子:
Return 一个 int
:
struct MyT
{
// Some stuff...
int size()
{
return some_calculation_returning_int();
}
// Some more stuff...
};
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...
};
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"三种变体:
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>()
函数将用于比较本身。
参考
我正在阅读 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
值进行比较(使用 >
)的东西。
让我们看三个例子:
Return 一个
int
:struct MyT { // Some stuff... int size() { return some_calculation_returning_int(); } // Some more stuff... };
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... };
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"三种变体:
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>()
函数将用于比较本身。
参考