簡體   English   中英

C ++中的模板:(F-)有界多態

[英]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_ifstatic_assert 並不等效。 雖然static_assert為您提供了生成良好錯誤消息的機會,但std::enable_if可幫助您解決重載,這意味着僅當CarT的基礎時才會調用上述函數,否則將選擇其他重載(如果有)考慮。 使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM