2013-08-08 5 views
5

죄송합니다.이 질문으로 인해 혼란이 생길 ​​경우이를 구현하려고하고 있는데 그런 일에 접근하는 올바른 방법을 모릅니다.네임 스페이스에서 메서드 체이닝

내 프로젝트 중 하나의 경우 메소드 체인을 구현하고 싶습니다. 나는 다음과 같은 기능을 통합하려는 :

.toVector() 
.toArray() 
.toBool() 
... 

내가 네임 스페이스 내에서 이러한 배치에 대한 생각을 예 :

namespace Misc { 
    template<typename T, typename Inverse> 

    vector<T> toVector(Inverse begin, Inverser end) { 
     // ... 
     // .. 
    } 

    // ... 
    // ... 
} 

이 여러 클래스가있을 수 있기 때문에, 이러한 클래스를 사용 할 수있을 것입니다 따라서 이러한 함수는 다른 클래스에서 각 함수를 반복해서 구현하는 것이 아니라 객체 지향적이어야합니다.

class Wav { 
    public: 
    Wav(); 
    Wav(string theFileName); 
    void getWaveData(); 
    protected: 
    vector<double> data; 
}; 

data 명시 적으로 클래스의 내부 벡터로 저장됩니다

의 내가 WAV 파일에 포함 된 데이터를 읽고 다음 클래스 Wav 있다고 가정 해 봅시다.

int main() 
{ 
    Wav wave("file.wav"); 

    int* data = wave.getWaveData().toArray(); // Method chaining to store as an array 
} 

나는이 가능할 것이다 여부를 모르는 그렇다면 것은 내가 Misc의 모든 기능을 구현하지 않고 접근 할 방법 : 내 주에서

나는 다음을 수행 할 수 있도록하려면 각 수업 내에서 반복해서. 모든 함수를 반복해서 포함하지 않아도 네임 스페이스와 클래스 사이에서 통신 할 수있는 방법이 있습니까?

누군가에게 제안을하고 그에 대한 답변을 드리겠습니다.

편집 :

나는이 기록 된 다음과 같은 기능 :

void process() 
{ 

} 

I 따라서의 params 안에 넣을 필요가 무엇 :

template<typename T, typename Inverse> 
T* toArray(Inverse begin, Inverse end) 
{ 
size_t size = distance(begin, end); 
auto pos = 0; 

T* tmp = new T[size]; 

for(auto i = begin; i != end; i++) 
{ 
    tmp[pos] = *i; 
    pos++; 
} 
return tmp; 
} 

그리고 또 다른 기능이있는 경우 process을 수락하려면 다음을 수락하십시오.

int* data = process(toArray<int>( std::begin(vals), std::end(vals) );

이것은 나를 가장 혼란스럽게하는 것입니까? 새로운 기능에 관한

+2

왜 메소드 체이닝을 수행해야합니까? 당신이 (잠재적으로 중첩 된) 함수 호출을 목표로한다면, 그것은 사소할 것이다. – delnan

+0

@delnan 무슨 뜻인지 말씀해 주시겠습니까? (Wave.getWaveData(). toArray(). toBool()'대신에 – Phorce

+2

'toBool (toArray (wave.getWaveData())) – delnan

답변

2

:

위하여는

int* data = process(toArray<int>(vals.begin(), vals.end())); 

아래 toArray 메서드의 반환 형식과 일치해야합니다 처리 방법에 대한 매개 변수를 처리 방법을 호출 할 수 있습니다. 아마도 아래와 같이 프로세스 메소드를 템플릿화할 수 있습니다.

template<typename T> 
T* process(T* t) 
{ 
    //more code here 
    return t; 
} 

위와 같이 처리 방법을 추가 한 후 프로세스에 대한 호출이 컴파일되지만 toArray 같은 다른 방법 다른 반환 형식을 처리 할만큼 일반적인 처리 방법의 구현을해야 할 것이다.

관련 문제