Ограничить шаблонную функцию базовыми и производными типами?

У меня есть базовый класс шаблона, подобный этому:

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 вместо Vector2d.

Поэтому я попробовал

template<V>
V operator*(typename V::data_type lhs, const V& rhs)
{
    ... 
}

, и это отлично работает, однако это может привести к двусмысленности, потому что это засасывает все остальное с data_type членом.

Как обойти это: как я могу написать тип безопасные функции, которые работают только с моей векторной базой или любыми производными?

Я пытаюсь обойти необходимость повторного объявления и переопределении операторов для подклассов.

5
задан DanDan 2 November 2011 в 22:22
поделиться