2010-04-06 1 views
3

templatized 클래스를 파괴 할 때 호출 할 함수 객체를 첨부하려고합니다. 그러나 함수 객체를 임시로 전달할 수없는 것처럼 보입니다. 내가 얻을 경고는 (주석 경우 라인 xi.data = 5;)입니다 :익명 임시 함수 객체를 템플릿 화 된 생성자에 전달할 때의 문제

warning C4930: 'X<T> xi2(writer (__cdecl *)(void))': 
    prototyped function not called (was a variable definition intended?) 
      with 
      [ 
       T=int 
      ] 

내가 구성된 객체를 사용하려고하면, 내가 말하는 컴파일 오류가 발생합니다 :

error C2228: left of '.data' must have class/struct/union 

나는 긴 사과 코드 조각이지만, 모든 구성 요소가 상황을 평가하기 위해 표시되어야한다고 생각합니다. 내가 "어떻게 든"클래스 내에서 함수 개체 자체의 인스턴스를 유지하지 않고 개체 유형을 기능 - 객체를 부착 할 수 있도록

template<typename T> 
struct Base 
{ 
    virtual void run(T&){} 
    virtual ~Base(){} 
}; 

template<typename T, typename D> 
struct Derived : public Base<T> 
{ 
    virtual void run(T& t) 
    { 
     D d; 
     d(t); 
    } 
}; 

template<typename T> 
struct X 
{ 
    template<typename R> 
    X(const R& r) 
    { 
     std::cout << "X(R)" << std::endl; 
     ptr = new Derived<T,R>(); 
    } 

    X():ptr(0) 
    { 
     std::cout << "X()" << std::endl; 
    } 

    ~X() 
    { 
     if(ptr) 
     { 
      ptr->run(data); 
      delete ptr; 
     } 
     else 
     { 
      std::cout << "no ptr" << std::endl; 
     } 
    } 

    Base<T>* ptr; 
    T data; 
}; 

struct writer 
{ 
    template<typename T> 
    void operator()(const T& i) 
    { 
     std::cout << "T : " << i << std::endl; 
    } 
}; 

int main() 
{ 
    { 
     writer w; 
     X<int> xi2(w); 
     //X<int> xi2(writer()); //This does not work! 
     xi2.data = 15;  
    } 

    return 0; 
}; 

나는 이것을 시도하고있는 이유입니다. 따라서 class X의 객체를 만들 때 class writer의 객체를 유지할 필요가 없지만 Base<T>에 대한 포인터 만 있습니다 (여기에 <T>이 필요하면 확실하지 않지만 현재는 해당 객체에 대한 포인터입니다).

문제는 내가 writer의 객체를 만든 다음 X의 생성자에 전달보다는 X<int> xi(writer();

내가 어떤 제안 여기 완전 바보 뭔가를 분명 누락 될 수 있습니다처럼 전화를해야하는 것이다 ?

+0

'shared_ptr'의 구현은 똑같은 것을 (삭제를 위해) 사용하기 때문에 가능합니다! 메모리를 다루기 위해서는 커스텀 복사 생성자와 할당 연산자가 필요합니다 ... 그래서 타입을 더 잘 만들 수 있습니다. –

+0

흥미롭게도 필자는 내 function-object가 상태를 유지할 수있는 방법을 생각할 수 없으며 삭제하는 동안 기본 구성된 function-object 만 사용할 수 있습니다. 예, 복사 생성자와 대입 연산자가 있지만 여기에서 코드를 제거하여 더 "표현 가능하도록"합니다 :). 감사! – Akanksh

답변

7

"가장 까다로운 구문 분석"문제처럼 보입니다.

X<int> xi2 = X<int>(writer()); 

또는

X<int> xi2((writer())); 
+0

니스, 둘 다 작동합니다! 그러나 "필요할 때"function-object를 사용하는 것의 아름다움은 손실됩니다 (또는 생성자에 대한 여분의 대괄호 또는 명시 적 호출이 필요함). 감사! (오! 그리고 나는 "가장 짜증나는 파싱"에 대해 들어 본 적이 없었기 때문에 새로운 것이었다. :) – Akanksh

+0

@Tyler McHenry 클래스가 'noncopyable'인 경우 첫 번째 예제가 작동하지 않는다는 점에 유의해야한다. 복사 생성자. – jwalk

5

주위에 대괄호를 사용하십시오 X<int> xi2((writer())); 이것은 미리 컴파일러가 기능을 생각하는 것을 멈추게 할 것입니다. (Scott Meyers Effective STL Item 6)

+0

도서 참조 주셔서 감사합니다. – Akanksh

5

X<int> xi2(writer()); 자체가 X<int>을 반환하는 함수라는 xi2의 선언이며, 매개 변수로 매개 변수를 사용하지 않는 및 작가를 반환하는 함수를 취하십시오. 그것은 "가장 짜증나는 구문"입니다.

해결 방법은 수행 한 작업을 수행하거나 임시 작업을 피하거나 괄호를 더 추가하는 것입니다.

관련 문제