2013-03-19 3 views
2

Bonjour Je me suis efforcé de construire une classe d'assistance pour initialiser un valarray stl. Ce que je voudrais est de faire ce qui suit:initialiser stl valarray en une ligne

std::valarray<float> vec(3); 
vlist_of<float>(vec)(2)(3)(5); 

je peux simplement initialiser les vecteurs à l'exécution en utilisant seulement une instruction de commande de ligne. Pour faire ce qui suit je tryed la structure suivante:

template <typename T> 
struct vlist_of { 
    std::valarray<T>& data; 
    int i; 
    vlist_of(std::valarray<T>& _data):data(_data),i(0) { 
     (*this)(data); 
    } 
    vlist_of& operator()(std::valarray<T>& data){return *this;} 
    vlist_of& operator()(const T& t) { 
     data [i]=t; 
     i++; 
     return *this; 
    } 
}; 

cette structure fonctionne si je fais ce qui suit:

vlist_of<float> tmp(vec);tmp(2)(3)(4); 

Est-il possible que je demande?

+0

Je ne comprends pas ce genre de réponse que vous recherchez. Par ailleurs, qu'est-ce que '(* this) (data);' for? : v –

+0

@ Magtheridon96 Je pense qu'il cherche l'initialisation de style 'Boost Assign' pour valarrays – sehe

Répondre

2

Oui. Faire vlist_of fonction de l'usine:

template <typename T> 
vlist_builder<T> vlist_of(std::valarray<T>& data) 
{ 
    return vlist_builder<T>(data); 
} 

Maintenant, il fonctionne http://liveworkspace.org/code/48aszl$0.

personnellement je préfère l'initialisation uniforme:

/*const*/ std::valarray<float> prefer { 2, 3, 5 }; 

Voir échantillon complet:

#include <valarray> 
#include <vector> 
#include <iostream> 

template <typename T> 
struct vlist_builder 
{ 
    std::valarray<T>& data; 
    int i; 
    vlist_builder(std::valarray<T>& _data):data(_data),i(0) { } 
    vlist_builder& operator()(const T& t) 
    { 
     data[i++]=t; 
     return *this; 
    } 
}; 

template <typename T> 
vlist_builder<T> vlist_of(std::valarray<T>& data) 
{ 
    return vlist_builder<T>(data); 
} 

int main() 
{ 
    std::valarray<float> vec(3); 
    vlist_of<float>(vec)(2)(3)(5); 

    for(auto f : vec) 
     std::cout << f << "\n"; 

    // prefer uniform initialization: 
    const std::valarray<float> prefer { 2, 3, 5 }; 
} 
+0

merci réponse rapide et agréable;) – jamk