2011-01-08 4 views
2

빠른 대리인을 통해 std::function을 사용하는 것과 관련하여 몇 가지 질문을 게시했습니다. 컬렉션에 std::function을 추가하고 제거 할 수있는 이벤트의 동작을 나타낼 수있는 방법을 제시했습니다. 또한 작은 EventArg -type 클래스의 전체 톤을 작성할 때 모범 사례에 대해 물어 보았습니다. 그리고 그 작은 디자인 결정도 역시 쉬었습니다. 이것은 훌륭한 커뮤니티입니다!많은 함수 대 많은 Lambdas?

이제 프리앰블을 제외하고는 제 구조가 갖추어져 있어야하며 들어오는 데이터를 처리 할 모든 핸들러를 작성할시기입니다.

typedef std::function<void(const CommandData&)> CommandDelegate; 
typedef boost::shared_ptr<CommandDelegate> CommandDelegatePtr; 
typedef std::map<short, CommandDelegatePtr> CommandMap; 

을 그리고 나는이 약 200 처리기를 추가 할 : 나는 std::map을 가지고, 그것은 다음과 같습니다. 표준 멤버 함수와 람다 중 하나를 선택할 수 있습니다.

멤버 함수를 생각할 때 가장 먼저 생각한 것은 200 개의 선언과 200 개의 구현과 하나의 커다란 소스 파일이었습니다.

이 모든 핸들러로 클래스를 오염시키지 않고 "글쎄, 그들은 단지 핸들이고, 람다를 사용하지 않는 이유는 무엇입니까?"라고 말하면서 클래스가 생성 될 때지도에 이러한 모든 익명 함수를 할당 할 수있을만큼 간단합니다. 작업 완료!

은 그럼 생성자가 큰 것을 깨달았다. 내가 생각할 수 인해 크기로 자신의 파일에 갈 수있는 'initializeMap` 도우미 함수를 호출 할 수 있습니다.

너희들은 어떻게 생각하세요?

  1. 의 200 개의 선언파일 .cpp 파일에 (다른 기능 사이) 200 실시 .h 파일
  2. 200 선언
  3. 없음 선언 200 람다는 ctor에 할당되지 별도 'handlers.cpp` 구현 파일
  4. 아니오 선언, 자신의 파일에 initializeMap 함수에 할당 된 200 개의 람다.

미리 감사드립니다.

답변

2

제 생각으로 가능한 경우 lambdas를 사용하십시오. 그들은 훨씬 더 유지 보수가 가능합니다. 예를 들어 멤버 함수가있는 경우 선언과 정의를 변경할 때마다 업데이트해야하며 고유 한 이름을 지정해야합니다. 람다는 훌륭한 선택입니다.멤버 변수에 대해 자동 형식 공제를 사용할 수 있다면 구성원 함수를 사용하지 않을 것입니다.

+0

나는 람다쪽으로 기울고있다. 내 메인 클래스에는 작은 핸들러가 없다는 생각이 듭니다. 그래서 질문을, 그들 할당 - 그래서 클래스 생성자/initializer 함수에 대한 질문 같아요. –

+0

3 또는 4, 내 개인적인 취향은 소스 파일보다 적지 만 현대 컴파일러가 동시에 컴파일 할 수 있기 때문에 실제로는 문제가되지 않습니다. – Puppy

+0

나는 꽤 동의하지만 확실하게하고 싶었다. 귀하의 회신에 감사드립니다. –

1

동적 인 기능이 실제로 필요합니까? 주류를 오염시키지 않는 것이 유일한 목적이라면 하위 클래스 만들기, 모든 코드를 여러 파일로 나누는 것과 같은 더 나은 (더 빠른) 솔루션이 있습니다.

머리글이 200 개의 기능을 가지지 만 변경되지 않으면 프로젝트가 너무 많이 부풀려지지 않습니다. 다른 한편으로는 비 대한 생성자가 더 나쁘다. 왜냐하면 언젠가 그것을 변경해야 할 가능성이 더 높기 때문에 200 개의 초기화를 모두 다시 컴파일해야하기 때문이다.

그 컴파일 시간은 아마 그렇게 길지 않을 것입니다. 그러나 왜 전혀 귀찮아하지 않습니까?

필자는 메인 클래스 나 다른 전용 클래스 나 파일에서 함수를 선언으로 유지하지만 동적으로 함수를 초기화하지는 않습니다.

+0

'동적'이라는 의미가 확실하지 않습니다 ... 데이터가 코드와 함께 전달되고 해당 코드에 대한 적절한 핸들러가 호출되어야하므로 'std :: function'이있는지도가 필요합니다. 이것이 역동적 인 의미가 아니라면 무엇을 의미합니까? –

+0

방금 ​​람다 함수를 의미했습니다. 미안하다면 미안해. – Cray

관련 문제