2011-04-06 8 views
7

C++ 1x 표준은 더 보편적 인 std::bind을 위해 이전 STL 바인더 함수를 사용하지 않습니다. 그러나 std::not1std::not2은 범용 std::not_ 또는 무엇인가가 사용되지 않을 것으로 보입니다. 실제로, C++ 1x 이전의 STL의 <functional> 부분은 1) 람다 부족, 2) 바인더와 부정 펑터가 중첩 된 typedef를 필요로한다는 사실 (의미 : argument_type)을 의미합니다. 3) 가변성 템플릿이 없기 때문에 인수의 수에 따라 바인더와 부정 함수가 별도로 필요했습니다.단항 및 이항 부정

C++ 1x가 모두 변경되어 유용성이 크게 향상되었습니다. <functional>. 하지만 몇 가지 이유로 C++ 1x는 을 제외한 모든 것을 개선 한 것 같습니다.std::not1std::not2. 물론 기존의 바인더가 사용되지 않는 동일한 방식으로 std::not1std::not2을 중단 한 것

template <class F> 
class negation 
{ 
    public: 

    negation(F f) : m_functor(f) { } 

    template <class... Args> 
    bool operator() (Args&&... args) const 
    { 
     return (!m_functor(args...)); 
    } 

    private: 

    F m_functor;  
}; 

template <class F> 
inline negation<F> not_(F f) 
{ 
    return negation<F>(f); 
} 

이 : 정말,이 같은 표준 보편적 negate 기능이 좋을 것이다.

질문 : 1) C++ 1x 초안을 살펴본 결과 범용 negate 기능에 대한 언급이 없습니다. 나는 그것을 놓쳤는가? 2) 유니버설 bind을 추가하고 이전 바인더를 사용하지 않는 몇 가지 이유가 있습니까?하지만 부정 기능에 대해 동일한 작업을 수행하지 못했습니다.

+0

''도 유용합니다. 이제 람다가 있습니까? –

+0

@Marcelo, 확실합니다. 'std :: bind'는 매우 유용합니다. – Channel72

+1

어떻게 그렇게? @ Howard가 [DeadMG의 대답] (http://stackoverflow.com/questions/5567342/unary-and-binary-negation/5567712#5567712)에 대한 의견은 [another answer] (http://stackoverflow.com/questions/) 링크입니다. 1930903/bind-vs-lambda/4581747 # 4581747) bind를 주장합니다. 왜냐하면 lambdas는 타입 유추를하지 않기 때문입니다. 솔직하게, 그러나 그것은 나에게 정확하게 정반대의 것을 확신시킨다.명시 적 타입 사용하기 -'auto f = [] (const char * a, float b) {cout << a << ''<< b; };'- 성가신 그대로는 그 대답에 제시된 구속력있는 해결책보다 훨씬 낫습니다. 얼마나 자주 바인드가 우수한 솔루션을 제공한다고 생각하십니까? –

답변

6
  1. 당신은 그것을 놓치지 않았습니다.

  2. 뚜렷한 이유는? 그것은 당신이 누구에게 묻 느냐에 달려 있습니다. 이 기능의 부족은 논의되었지만 프로세스의 마지막 단계까지는 논의되지 않았습니다. 흠 ... 나는 지금 그 일에 대한 서류를 찾을 수 없다.

가장 좋은 해결책은 연산자!()를 추가하여 바인딩하는 것입니다. 그러나이 시점에이위원회는 C++ 11에 새로운 기능을 추가 할 기분이 없었습니다. 아마 그것은 기술 보고서에 올 것이다. 람다 훨씬 우수한 솔루션이기 때문에,

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3224.html#gb97

+0

흥미 롭습니다. 나는'바인딩'에 대한 과부하에 대한 명제가 거부되었다고 믿을 수 없다. – Channel72

+0

"이번에는"C++ 0x 이후에 다시 고려하고 싶습니다. 좋은 표준을 만드는 것은 시간이 많이 걸리는 일입니다. 완전한 것을 창조하는 것은 말 그대로 영원히 필요합니다.

+0

깨진 것을 고치는 것보다 빠릅니다! – Potatoswatter

1

효과적으로하지 않을 경우 공식적으로, 기존의 함수 객체 바인딩 시스템의 모든이되지 않습니다 :

아, 여기 서류입니다. 나는 그들이 bind과 그것의 나머지의 무엇이든을 새롭게하는 것을 고뇌했다 고 더 흥미롭게 여긴다.

대부분의 경우, 원래 boost::bind 같은 negate 기능을 제공하지 않았고, 새로운 TR1/C++ 0X 바인딩 메커니즘의 모든 기반으로, 아무도 not이 누락 된 것으로 나타났습니다 없기 때문에이 것을 발견 할 것이다 .

+1

위원회는 구속력이 없어 졌다고 간주하지 않습니다. 이유에 대한 좋은 답변은 다음과 같습니다. http://stackoverflow.com/questions/1930903/bind-vs-lambda/4581747#4581747 –

+0

@Howard : "공식적으로"라고 말한 것은 아닙니다. 위원회에 의해 비추천. – Puppy

+0

@Dead : 대답 읽기 ... – Potatoswatter