2014-09-25 1 views
0

호출 가능한 요소를 호출 할 수 있도록 호출 가능한 요소의 큐를 만들려고합니다. 호출 할 수있는 요소를 저장할 수 있고 나중에 호출해야합니다. 그 안에 저장된 정수를 확인한 후).std :: function에서 파생하는 것이 수동으로 Functor를 만드는 것입니다.

저는 지난 며칠 동안 functor와 std :: function 템플릿에 대해 읽었으며 다음 두 옵션 중 어느 것이 메모리와 성능면에서 더 좋을지 궁금합니다 다른 경우).

1 옵션 :

class UpdateFunction : public std::function<bool(unsigned long long int)> { 
public:  
    unsigned long long int _intendedTime; 
}; 

void main() 
{ 
    typedef std::deque<UpdateFunction> UpdateQueue; 
    UpdateQueue _updateQueue; 

    _updateQueue.push_back(UpdateFunction([](unsigned long long int time)->bool{return outsideFunction(time);})); 
    _updateQueue.back()._intendedTime = 10; 
} 

2 옵션 :

class UpdateFunction { 
    bool (*_fn)(unsigned long long int); 
    unsigned long long int _intendedTime; 

    UpdateFunction::UpdateFunction(bool (*fn)(unsigned long long int), unsigned long long int time) 
     : _fn(fn), 
      _intendedTime(time) 
    { 
    } 

    bool operator()(unsigned long long int time) 
    { 
     return _fn(time); 
    } 
}; 

void main() 
{ 
    typedef std::deque<UpdateFunction> UpdateQueue; 
    UpdateQueue _updateQueue; 

    _updateQueue.push_back(UpdateFunction(outsideFunction, 10)); 
} 

내가 예상대로이 작동 것조차 확실하지 않다 그래서 누군가가 표준에서 파생 코드 :: 기능을 본 적이 없다 .

내가하려는 것은 다음과 같습니다. https://stackoverflow.com/a/9050114/4076418하지만 변수 인수가 필요하지 않습니다. (실제로 위의 코드에있는 하나의 단일 서명 만 있습니다. 그것의 인스턴스를 포함하는 대신 std :: function에서 파생하는 것이 더 나을 것이라고 생각했습니다. 솔직히 말해서, 나는 얼마나 느리거나 빠른 std :: function인지 모른다. 나는 타입 지우기에 대한 언급을 읽었지만 아직도 그게 무엇인지 알아 내려고하고있다.

NB : 저는 C++ 초보자입니다. 참고 문헌을 옮겨서 의미론을 옮기기 위해 노력하고 있습니다. 따라서 코드에 명백한 오류가 있거나 코딩 스타일이 끔찍한 경우 사과드립니다.

답변

1

이 옵션을 사용하면 function의 유연성을 얻을 수 있지만 생성자를 처리해야하는 부작용을 피할 수 있습니다.

struct UpdateFunction { 
    std::function<bool(unsigned long long int)> fn; 
    unsigned long long int _intendedTime; 
}; 

당신은, 당신은 단지 실제로 우아한 솔루션입니다

queue.push_back(UpdateFunction{outsideFunction, 10}); 
+0

말할 수있는 특별한 생성자가 필요하지 않습니다. 하지만 내 부분에 오류가있어 제 경우에 맞을지 확실하지 않습니다. 나는 (어리석게도) outsideFunction에 대기열에있는 호출 가능 요소보다 많은 매개 변수가 있다는 것을 생략 했으므로 이것이 첫 번째 옵션에서 람다를 사용하는 이유입니다. 죄송합니다,하지만 고마워요 :) – elatalhm

+0

내가 썼던 코드가 얼마나 엉망인지 깨닫고, outsideFunction에 더 많은 매개 변수가있는 경우 두 번째 옵션에서 작동하지 않습니다. 지금 당장 고칠거야. – elatalhm

+1

답변 해 주셔서 감사합니다. 혼란 스러움을 많이 겪은 후, 제 질문은 거의 쓸모가 없다는 것을 깨달았습니다. 만약 내가 원래의 옵션 2와 같은 함수 포인터를 가지고 도망 갈 수 있는지 궁금 해서요. 그러나 currying과 lambda의 변수 캡쳐를 사용하고 싶다면 std :: function을 사용해야합니다.). 그리고 std :: function의 부재/존재로 인해 성능에 대해 묻는 것이 었습니다. – elatalhm