c++11functions

4469 단어 functionC++11
function은 함수 대상 포장류의 템플릿으로 일반적인 리셋 메커니즘을 실현했다.function은 함수 바늘과 비교적 비슷하다. 장점은 사용자가 목표의 실현에 있어 더욱 큰 탄력을 가질 수 있다는 것이다. 즉, 목표는 일반 함수일 수도 있고 함수 대상과 클래스의 구성원 함수일 수도 있으며 함수에 상태를 추가할 수 있다는 것이다.
function을 설명할 때, 포장된 함수 대상의 반환값 형식과 매개 변수의 형식을 제시해야 합니다.예를 들어 하나의 function을 설명하면 bool 형식을 되돌려주고 int 형식과float 형식의 매개 변수를 받아들일 수 있습니다. 아래와 같이 할 수 있습니다.
function f;
다음은 function의 비교적 중요한 몇 가지 인터페이스를 간략하게 소개한다.
function();
구조 함수가 부족하여 빈 함수 대상을 만듭니다.빈 function이 호출되면bad_function_콜의 이상.
    
template function(F g);
이 범용 구조 함수는 호환되는 함수 대상, 즉 이러한 함수나 함수 대상을 받아들인다. 그 반환 유형은 구조된function의 반환 유형과 같거나 은식으로 변환할 수 있고, 그 매개 변수도 구조된function의 매개 변수 유형과 같거나 은식으로 변환할 수 있다.다른 function 실례를 사용하여 구성할 수도 있습니다.이렇게 하고 function g가 비어 있으면 구조된 function도 비어 있다.빈 함수 바늘과 빈 구성원 함수 바늘을 사용하면 빈 function이 생성됩니다.만약 이렇게 하고 function g가 비어 있다면, 구조된 function도 비어 있다.빈 함수 바늘과 빈 구성원 함수 바늘을 사용하면 빈 function이 생성됩니다.
 
template function(reference_wrapper g);
이 구조 함수는 이전과 유사하지만, 받아들인 함수 대상은reference_wrapper에서 값을 통해 전달되는 것을 피하기 위해 함수나 함수 대상의 복사본을 생성합니다.이것은 함수 대상이 function의 서명과 호환되도록 요구합니다.
 
function& operator=(const function& g);
값 조작부호는 g의 함수나 함수 대상의 복사본을 저장한다.만약 g가 비어 있다면, 부여된 함수도 비어 있을 것이다.
 
template function& operator=(F g);
이 범용 값 부여 조작부호는 호환되는 함수 바늘이나 함수 대상을 받아들인다.다른 function 실례 (서로 다르지만 호환되는 서명 포함) 로 값을 부여할 수도 있습니다.이것은 g가 다른 function 실례이고 비어 있으면 값을 부여한 함수도 비어 있다는 것을 의미한다.빈 함수 바늘이나 빈 구성원 함수 바늘을 지정하면function이 비어 있습니다.
 
bool empty() const;
이 구성원 함수는 함수나 함수 대상을 포함하고 있는지 여부를 나타내는 부울 값을 되돌려줍니다.목표 함수나 함수 대상이 호출될 수 있다면false로 되돌아옵니다.하나의function는 블의 상하문에서 테스트하거나 0과 비교할 수 있기 때문에 이 구성원 함수는 미래 버전의 라이브러리에서 취소될 수 있습니다. 사용하지 마십시오.
 
void clear();
이 구성원 함수는function을 제거합니다. 함수나 함수 대상에 더 이상 연결되지 않습니다.만약 function이 비어 있다면, 이 호출은 영향을 주지 않습니다.호출된 후,function은 비어 있을 것입니다.function을 비우는 가장 좋은 방법은 0을 부여하는 것이다.clear는 미래 버전의 라이브러리에서 취소될 수 있습니다.
 
result_type operator()(Arg1 a1, Arg2 a2, ..., ArgN aN) const;
조작부호를 호출하는 것은function를 호출하는 방법이다.빈 function을 호출할 수 없습니다. 그러면 bad_function_콜의 이상.호출 조작부호의 실행은function의 함수나 함수 대상을 호출하여 결과를 되돌려줍니다.
다음은 function을 사용하여 일반 함수, 함수 대상과 클래스의 구성원 함수를 포장하는 참고 코드를 제시한다.
1. 일반 함수
1 int Add(int x, int y)
2 
3 {
4             return x+y;
5 }
6 function<int (int,int)> f = Add;
7 int z = f(2, 3);

2. 함수 대상
1 class CStudent
 2 {
 3 public:
 4             void operator() (string strName, int nAge)
 5             {
 6                 cout << strName << " : " << nAge << endl; 
 7             }
 8 };
 9 
10 CStudent stu;
11 function<void (string, int)> f = stu;
12 f("Mike",  12);

3. 클래스의 구성원 함수
1 struct TAdd
 2 {
 3     int Add(int x,int y)
 4     {
 5         return x+y;
 6     }
 7 };
 8 
 9 function<int  (TAdd *, int, int)> f = TAdd::Add;
10 TAdd tAdd;
11 f(&tAdd, 2, 3);   //  , tAdd 

다음은 함수 대상의 상태를 function으로 저장하는 상황을 살펴봅시다.다음 코드를 고려하십시오.
 
1 class CAdd
 2 {
 3 public:
 4     CAdd():m_nSum(0) { NULL; }
 5     int operator()(int i)
 6     {
 7           m_nSum += i;
 8           return m_nSum;
 9     }
10 
11     int Sum() const 
12     {
13         return m_nSum;
14     }
15 
16 private:
17     int m_nSum;
18 };
19 
20 int main() 
21 {
22     CAdd add;
23     function<int (int)> f1 = add;
24     function<int (int)> f2 = add;
25     cout << f1(10) << "," << f2(10) << "," << add.Sum() << endl;
26     return 0;
27 }

여러분이 상상한 결과와 다를 수 있습니다. 위의 프로그램의 출력은 10, 10, 0입니다.우리는 같은 함수 대상을 두 개의 function에 값을 부여한 후에 각각 이 두 개의 function을 호출했지만 함수 대상 중 m_nSum의 상태가 유지되지 않았습니다. 문제는 어디에 있습니까?이것은 function의 부족한 행위가 그 함수 대상을 복사하는 것이기 때문에 f1과 f2에 저장된 것은 모두add 대상의 복사입니다. f1과 f2를 호출한 후add 대상의 값은 수정되지 않았습니다.
C++ 11에서 ref와cref 함수를 제공하여 대상의 인용과 자주 인용하는 포장을 제공합니다.함수 객체의 상태를 function에 올바르게 저장하려면 코드를 수정할 수 있습니다.
1 CAdd add;
2 function<int(int)> f1 = ref(add);
3 function<int(int)> f2 = ref(add);

또한 두 function 사이에 값을 부여할 때 원본 function이 함수 대상의 복사본을 저장하면 목표 function이 저장하는 것도 함수 대상의 복사본이다.원본function이 함수 대상의 인용을 저장하면 목표function이 저장하는 것도 함수 대상의 인용입니다.
- 이 문서는 창세 소프트웨어 팀 블로그에서 유래한 것으로, 원문 주소:http://www.cnblogs.com/hujian/archive/2012/12/07/2807605.html

좋은 웹페이지 즐겨찾기