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();
내가 어떤 제안 여기 완전 바보 뭔가를 분명 누락 될 수 있습니다처럼 전화를해야하는 것이다 ?
'shared_ptr'의 구현은 똑같은 것을 (삭제를 위해) 사용하기 때문에 가능합니다! 메모리를 다루기 위해서는 커스텀 복사 생성자와 할당 연산자가 필요합니다 ... 그래서 타입을 더 잘 만들 수 있습니다. –
흥미롭게도 필자는 내 function-object가 상태를 유지할 수있는 방법을 생각할 수 없으며 삭제하는 동안 기본 구성된 function-object 만 사용할 수 있습니다. 예, 복사 생성자와 대입 연산자가 있지만 여기에서 코드를 제거하여 더 "표현 가능하도록"합니다 :). 감사! – Akanksh