function의 깊은 이해

5350 단어
전통 리셋 함수

#include 
#include 
using namespace std;
 
//  C 
int c_function(int a, int b)
{
    return a + b;
}
 
//  
class Functor
{
public:
    int operator()(int a, int b)
    {
        return a + b;
    }
};
 
int main(int argc, char** argv)
{
    int(*f)(int, int);    //  , 
    f = c_function;
    cout << f(3, 4) << endl;
 
    Functor ff = Functor(); //  , 
    cout << ff(3, 4) << endl;

c++ 11 기능 도입
#include 
#include 
using namespace std;

std::function< int(int)> Functional;

//  
int TestFunc(int a)
{
    return a;
}

// Lambda 
auto lambda = [](int a)->int{ return a; };

//  (functor)
class Functor
{
public:
    int operator()(int a)
    {
        return a;
    }
};

// 1. 
// 2. 
class TestClass
{
public:
    int ClassMember(int a) { return a; }
    static int StaticMember(int a) { return a; }
};

int main()
{
    //  
    Functional = TestFunc;
    int result = Functional(10);
    cout << " :"<< result << endl;

    // Lambda 
    Functional = lambda;
    result = Functional(20);
    cout << "Lambda :"<< result << endl;

    //  
    Functor testFunctor;
    Functional = testFunctor;
    result = Functional(30);
    cout << " :"<< result << endl;

    //  
    TestClass testObj;
    Functional = std::bind(&TestClass::ClassMember, testObj, std::placeholders::_1);
    result = Functional(40);
    cout << " :"<< result << endl;

    //  
    Functional = TestClass::StaticMember;
    result = Functional(50);
    cout << " :"<< result << endl;

    return 0;
}

호출 가능한 실체가 std로 변환되는 것에 대해:function 대상은 다음과 같은 두 가지 원칙을 준수해야 한다. 변환된 std::function 대상의 매개 변수는 호출 가능한 실체의 매개 변수로 변환할 수 있다.실체를 호출할 수 있는 반환 값은 std::function 대상의 반환 값으로 변환할 수 있습니다.std:::function 대상의 가장 큰 용도는 함수 리셋을 실현하는 것입니다. (실제 작업에서 이 점을 사용합니다.) 사용자는 서로 같거나 같지 않은 것을 검사하는 데 사용할 수 없지만 NULL이나nullptr와 비교할 수 있습니다.
깊이 이해하다
#include 
#include 
#include 
using namespace std;
 
//  
int add(int i, int j) { return i + j; }
// lambda 
auto mod = [](int i, int j){return i % j; };
//  
struct divide
{
	int operator() (int denominator, int divisor)
	{
		return denominator / divisor;
	}
};
 
///////////////////////////SubMain//////////////////////////////////
int main(int argc, char *argv[])
{
	//  map
	map binops_limit;
	binops_limit.insert({ '+', add });
	binops_limit.insert({ '%', mod });
	//  	1	error C2664: “void std::_Tree<:_tmap_traits>>::insert(std::initializer_list<:pair _kty="">>)”:   1  “initializer-list” “std::pair &&”
	// binops_limit.insert({ '%', divide() });
 
	//  map
	map> binops = 
	{
		{ '+', add },
		{ '-', minus() },
		{ '*', [](int i, int j){return i - j; } },
		{ '/', divide() },
		{ '%', mod },
	};
	cout << binops['+'](10, 5) << endl;
	cout << binops['-'](10, 5) << endl;
	cout << binops['*'](10, 5) << endl;
	cout << binops['/'](10, 5) << endl;
	cout << binops['%'](10, 5) << endl;
	system("pause");
	return 0;
}
///////////////////////////End Sub//////////////////////////////////

위에서 보듯이function은 일반 함수,lambda표현식과 함수 대상류를 통일시킬 수 있습니다.그것들은 같은 유형이 아니지만,function 템플릿 클래스를 통해 같은 유형의 대상 (function 대상) 으로 바뀌어 맵에 넣을 수 있다.
또한 제가 실제 테스트한 결과를 보면 VS2013 컴파일러에서 상술한 코드는 통과할 수 있고 5판 의 512페이지 첫 줄에서 말한 "오류:mod는 함수 지침이 아니다"는 오류가 발생하지 않았습니다. 아마도 C++11 표준에 대한 다른 실현일 것입니다.
 
#include 
#include 
using namespace std;
 
//  C 
int c_function(int a, int b)
{
    return a + b;
}
 
//  
class Functor
{
public:
    int operator()(int a, int b)
    {
        return a + b;
    }
};
 
int main(int argc, char** argv)
{
    //  
    std::function callableObject;
 
    //  C 
    callableObject = c_function;
    cout << callableObject(3, 4) << endl;
 
    //  
    Functor functor;
    callableObject = functor;
    cout << callableObject(3, 4) << endl;
 
    //  lambda ( )
    callableObject = [](int a, int b){
        return a + b;
    };
    cout << callableObject(3, 4) << endl;
#include 
#include 
#include 
using namespace std;
 
//  C 
int c_function(int a, int b)
{
    return a + b;
}
 
//  
class Functor
{
public:
    int operator()(int a, int b)
    {
        return a + b;
    }
};
 
int main(int argc, char** argv)
{
    Functor functor;
    std::list<:function int="">> callables;
 
    callables.push_back(c_function);
    callables.push_back(functor);
    callables.push_back([](int x, int y)->int{
        return x + y;
    });
 
    for (const auto& e : callables)
    {
        cout << e(3, 4) << endl;
    }
}

좋은 웹페이지 즐겨찾기