我有一個模板基類是這樣的:將模板函數限制爲基類和派生類型?
template<typename T, std::size_t Size>
class VectorT
{
public:
typedef T data_type;
}
和一些專業派生類:
template<typename T>
class Vector2d : public VectorT<T, 2U>
{ // some specialised functions }
template<typename T>
class Vector3d : public VectorT<T, 3U>
{ // some other specialised functions }
這些做工精細。 Howerver,我爲操作員提供了一些獨立的功能。例如:
template<typename T, size_t Size>
VectorT<T, Size> operator*(T lhs, const VectorT<T, Size>& rhs)
{
...
}
不幸的是,這些沒有爲我的派生類的工作,因爲他們返回VectorT<T, Size>
而不是Vector2d<T>
的。
所以我試圖用
template<V>
V operator*(typename V::data_type lhs, const V& rhs)
{
...
}
,這工作得很好,但它可能會導致歧義,因爲它在其他任何一個成員DATA_TYPE吮吸。
我該如何解決這個問題:我該如何編寫類型安全函數,這些函數只能用於我的向量基或者任何派生類?
我想解決不得不重新聲明和重新定義子類的操作符。
謝謝你,這是今晚你第二次給我一個涉及SFINAE的答案;我認爲這是我所知道的空白所在!我不確定enable_if是如何工作的,但是這個工作非常好。再次感謝你。 – DanDan
@Kballo:關於用'std ::' - 替換'boost ::'請注意'std :: enable_if'對'boost :: enable_if_c'是一個嚴格的等價物,因此你必須「解開」切換到'std ::'時,您自己的'is_base_of'的值''成員。 –