[英]Templates in C++: (F-)bounded polymorphism
我已經檢查了一段時間的內聯網,並找到了我的問題的任何答案。 我想知道C ++是否支持有界多態性和/或F-有界多態性。
例如,在Java程序員中可以做到這一點(boundedn polymorphism):
<T extends Car> void startEngine(T c) {/*body method*/}
這個(F-有界多態性):
<T extends Comparable<T>> void compareWith(T c) {/*body method*/}
在C ++中有什么相同的東西嗎?
謝謝!
<T extends Car> void startEngine(T c) {}
在C ++中,與上面相同的是:
template<typename T, typename Unused= typename std::enable_if<std::is_base_of<Car,T>::value>::type>
void startEngine(T c) {}
好吧,語法很難看,但你可以用別名使它更好一些:
//first define a (reusuable) alias
template<typename D, typename B>
using extends = typename std::enable_if<std::is_base_of<B,D>::value>::type;
//then your code would look like this
template<typename T, typename Unused=extends<T,Car> >
void startEngine(T c)
{
}
或者你可以使用static_assert
,正如另一個答案所解釋的那樣。 但是std::enable_if
和static_assert
並不等效。 雖然static_assert
為您提供了生成良好錯誤消息的機會,但std::enable_if
可幫助您解決重載,這意味着僅當Car
是T
的基礎時才會調用上述函數,否則將選擇其他重載(如果有)考慮。 使用static_assert
,這是不可能的:它只是失敗並停止 - 它不會進一步查看重載。
同樣,
//then your code would look like this
template<typename T, typename Unused=extends<T,Comparable<T>> >
void compareWith(T c)
{
}
這種技術被稱為:
希望有所幫助。
在C ++ 11中,您可以使用static_assert和type traits來檢查template參數是否是從特定類派生的類。 例如:
#include <type_traits>
class Base {};
class Derived : Base {};
class Other {};
template<class T>
void foo(T t)
{
static_assert(std::is_base_of<Base, T>::value, "T must be a class derived from Base");
}
int main()
{
foo(Derived()); // ok
foo(Base()); // ok
foo(Other()); // error: static assertion failed: T must be a class derived from Base
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.