Sto scrivendo una classe vettoriale semplice e vorrei avere alcune funzioni membro che sono disponibili solo in vettori di determinate lunghezze (prodotto incrociato per un vettore di 3 elementi per esempio). Mi sono imbattuto in std :: enable_if e sembra che sia in grado di fare ciò che voglio, ma non riesco a farlo funzionare correttamente.Utilizzo di C++ 11 std :: enable_if per abilitare la funzione membro se il vettore è lunghezza specifica
#include <iostream>
#include <type_traits>
template<typename T, unsigned int L>
class Vector
{
private:
T data[L];
public:
Vector<T,L>(void)
{
for(unsigned int i = 0; i < L; i++)
{
data[i] = 0;
}
}
T operator()(const unsigned int i) const
{
return data[i];
}
T& operator()(const unsigned int i)
{
return data[i];
}
Vector<typename std::enable_if<L==3, T>::type, L> cross(const Vector<T,L>& vec2) const
{
Vector<T,L> result;
result(0) = (*this)(1) * vec2(2) - (*this)(2) * vec2(1);
result(1) = (*this)(2) * vec2(0) - (*this)(0) * vec2(2);
result(2) = (*this)(0) * vec2(1) - (*this)(1) * vec2(0);
return result;
}
};
int main(void)
{
Vector<double,3> v1;
Vector<double,3> v2;
Vector<double,3> v3;
//Vector<double,4> v4;
v1(0) = 1;
v1(1) = 2;
v1(2) = 3;
v2(0) = 4;
v2(1) = 5;
v2(2) = 6;
v3 = v1.cross(v2);
std::cout << v3(0) << std::endl;
std::cout << v3(1) << std::endl;
std::cout << v3(2) << std::endl;
return 0;
}
Il codice sopra compilato ed eseguito in modo corretto, se mi Rimuovere il commento la dichiarazione di Vector<double,4> v4
ottengo il seguente errore in compilazione:
vec.cpp: In instantiation of ‘class Vector<double, 4u>’:
vec.cpp:46:22: required from here
vec.cpp:29:59: error: no type named ‘type’ in ‘struct std::enable_if<false, double>’
è qualcuno in grado di indicare dove sto andando male?
possibile duplicato del [Posso usare boost :: abilitare \ _Se su una funzione di membro?] (Http: // StackOverflow .com/questions/4880922/can-i-use-boostenable-if-on-a-member-function) –
Probabilmente vuoi 'typename std :: enable_if> :: type' piuttosto che 'Vector :: type, L>'. –
(Probabilmente vuoi che il tuo 'operatore'() 'restituisca' T const & 'Anche il codice corrente consente ai client di fare qualcosa come' Vector v; Vector const & const_v = v; const_v (2) = 42.0; // Nota che la scrittura di 42 avviene temporaneamente. Non è quello che l'utente si aspettava!) –