Ho una classe di base template in questo modo:Limita una funzione basata su modelli ai tipi di base e derivati?
template<typename T, std::size_t Size>
class VectorT
{
public:
typedef T data_type;
}
e un paio di classi derivate specializzate:
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 }
e questi funzionano bene. Howerver, ho alcune funzioni indipendenti per gli operatori. Per esempio:
template<typename T, size_t Size>
VectorT<T, Size> operator*(T lhs, const VectorT<T, Size>& rhs)
{
...
}
Purtroppo questi non funzionano per le mie classi derivate, perché restituiscono un VectorT<T, Size>
invece di un Vector2d<T>
.
così ho provato con
template<V>
V operator*(typename V::data_type lhs, const V& rhs)
{
...
}
e questo funziona bene, ma può portare ad ambiguità perché aspira qualsiasi altra cosa con un membro data_type.
Come posso aggirare questo: come posso scrivere funzioni di sicurezza del tipo che funzionano solo con la mia base vettoriale, o qualsiasi derivata di?
Sto cercando di evitare di dover ripetere nuovamente e ridefinire gli operatori per le sottoclassi.
Grazie, questa è la seconda volta che questa sera mi hai dato una risposta che coinvolge la SFINAE; Penso che sia qui che risiedono le lacune nelle mie conoscenze! Non sono sicuro di come enable_if funzioni ancora, ma ha funzionato molto bene. Grazie ancora. – DanDan
@Kballo: per quanto riguarda la sostituzione di 'boost ::' di 'std ::' -> nota che 'std :: enable_if' è un equivalente rigoroso per' boost :: enable_if_c', quindi dovresti "scartare" il ' membro 'value' di' is_base_of' quando passi a 'std ::'. –