J'écris une classe de vecteurs simple et j'aimerais avoir des fonctions membres qui ne sont disponibles que dans des vecteurs de certaines longueurs (produit croisé pour un vecteur à 3 éléments par exemple). J'ai trébuché sur std :: enable_if et il semble qu'il puisse faire ce que je veux, mais je ne semble pas pouvoir le faire fonctionner correctement.Utilisation de C++ 11 std :: enable_if pour activer la fonction de membre si le vecteur est de longueur spécifique
#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;
}
Le code ci-dessus compile et fonctionne correctement, si je décommenter la déclaration de Vector<double,4> v4
je reçois l'erreur suivante à la compilation:
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>’
est quelqu'un capable de montrer où je me trompe?
double possible de [Puis-je utiliser boost :: activer \ _Si une fonction de membre?] (Http: // stackoverflow .com/questions/4880922/can-i-use-boostenable-if-on-a-member-function) –
Vous voulez probablement 'typename std :: enable_if> :: type' plutôt que 'Vector :: type, L>'. –
(Vous voulez probablement que votre opérateur const() 'renvoie T const &' Le code actuel permet aux clients de faire quelque chose comme 'Vector v; Vector const & const_v = v; const_v (2) = 42.0; // Notez que l'écriture de 42 arrive à un temporaire Pas ce que l'utilisateur attendait) –