2016-11-30 65 views
2

我一直沒有這樣做過一段時間。我基本上有一個類元編程C++,兩個模板之間的最大參數

template <int L> 
class MyInteger { 
//code 
}; 

而具體我想實現像(作爲一種方法)

template <int L, int M, int N> 
MyInteger<N> MyInteger<L>::operator+(const MyInteger<M>& x) const; 

但我想限制N是​​有沒有辦法實現使用模板元編程?我在考慮使用enable_if,也許SFINAE可以讓我實現我想要的,但我不完全確定如何做到這一點。

回答

0

你只是想讓它成爲兩者中的最大值?或者你希望它不超過兩者中的最大值?如果你希望它永遠是最大我想創建一個實用程序結構如下圖所示,並設置N作爲

template<int L,int M> 
struct MaxInteger 
{ 
public: 
    static const int value = L > M ? L : M; 
}; 

然後實現它是這樣。

template<int L, int M> 
MyInteger<MaxInteger<L,M>::value> MyInteger<L>::operator+(const MyInteger<M>& x) const; 

編輯:按照要求執行constexpr。

constexpr int constMax(constexpr int a,constexpr int b) {return a > b ? a : b;} 

然後實現這樣

template<int L, int M> 
MyInteger<constMax(L,M)> MyInteger<L>::operator+(const MyInteger<M>& x) const; 

,或者你可以做到這一點沒有結構

template<int L, int M> 
MyInteger<L > M ? L : M> MyInteger<L>::operator+(const MyInteger<M>& x) const; 
+0

現在是兩者中的最大值,在另一種情況下它會發生什麼變化?無論如何,這是元編程的一般方式嗎?用這些特性聲明輔助結構? – user8469759

+0

它曾經是唯一的方法。現在你有了C++ 11的constexpr選項,有時候type_traits頭文件會有你所需要的。 – user2927848

+0

你能告訴我這些功能的使用嗎?只是作爲未來的參考,我還有什麼可以研究的。 – user8469759

0

在C++ 14(爲您所標記的問題),你可以簡單地這樣做:

#include <type_traits> 

template <int L> 
class MyInteger {}; 

template <int L, int M> 
constexpr auto operator+(const MyInteger<L> &lhs, const MyInteger<M> &rhs) { 
    return MyInteger<(L > M ? L : M)>{}; 
} 

int main() { 
    constexpr MyInteger<0> m1; 
    constexpr MyInteger<1> m2; 
    static_assert(std::is_same<decltype(m1 + m2), MyInteger<1>>::value, "!"); 
} 

也就是說,使用auto返回類型,讓編譯器爲您推導出它。
然後,在函數的主體中,您可以選擇最大值並創建正確的類型。

如果你喜歡更明確一些返回類型,另一種可能的解決方案是這樣的:

template <int L, int M> 
constexpr MyInteger<(L > M ? L : M)> operator+(const MyInteger<L> &lhs, const MyInteger<M> &rhs) { 
    return {}; 
} 

無需SFINAE任何地方使用。