2013-03-19 3 views
2

안녕하세요. stl valarray를 초기화하는 도우미 클래스를 작성하도록 wannted되었습니다. 내가 원하는 것은 다음과 같습니다 :한 행에 stl valarray를 초기화하십시오.

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

그래서 난 단지 하나의 행 명령문을 사용하여 런타임에 벡터를 초기화 할 수 있습니다.

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

내가 요구하고있는 무슨 가능한가 : 다음 작업을 수행 할 경우

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; 
    } 
}; 

이 구조가 작동 : 나는 다음과 같은 구조를 tryed 한 다음 작업을 수행하는 ?

+0

난 당신이 찾고있는 해답의 종류를 이해하지 않습니다

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

가 전체 샘플을 참조하십시오. 그런데'(* this) (data);는 무엇입니까? : –

+0

@ Magtheridon96 그는 부스터 할당 스타일 어레이 valarrays에 대한 – sehe

답변

2

예. 공장 기능을 vlist_of 확인 :

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

가 지금은 http://liveworkspace.org/code/48aszl$0 작동합니다.

개인적으로 균일 초기화를 선호하는 것 :

#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

감사합니다 친절하고 빠른 대답을 찾고 있다고 생각;) – jamk

관련 문제