nprogram’s blog

気ままに、プログラミングのトピックについて書いていきます

std::functionについて [C++]

はじめに

functionクラステンプレートは、パラメータの型リストArgTypes...、戻り値の型Rに合致する、あらゆる関数ポインタ、関数オブジェクト、メンバ関数ポインタ、メンバ変数ポインタを保持できるクラスです。

使用例

#include <iostream>
#include <functional>

using namespace std;

// 通常の関数
int add(int a, int b)
{
    return a + b;
}

// 関数オブジェクト
class Functor
{
    public:
        int operator() (int a, int b)
        {
            return a + b;
        }
};

// クラスを宣言
class Calculater
{
    public:
        static int AddMethod(int a, int b)
        {
            return a + b;
        }
};


int main(void){
    std::function<int (int,int)> f;
    
    auto func = [](int a, int b)->int { return a + b; };
    
    f = func;
    // ラムダ式を代入
    std::cout << "To assign Class template std::function to lambd : "<< f(1, 2) << std::endl;
    
    f = nullptr;
    f = &add;
    // 関数ポインタ代入
    std::cout << "To assign Class template std::function to function pointer : "<< f(3, 4) << std::endl;
    
    f = nullptr;
    f = Functor();
    // 関数オブジェクト代入
    std::cout << "To assign Class template std::function to Functor : "<< f(5, 6) << std::endl;
    
    f = nullptr;
    
    Calculater calculate;
    
    f = calculate.AddMethod;
    // クラスの静的メンバ関数を代入
    std::cout << "To assign Class template std::function to Class Member Method : "<< f(7, 8) << std::endl;
}
To assign Class template std::function to lambd : 3
To assign Class template std::function to function pointer : 7
To assign Class template std::function to Functor : 11
To assign Class template std::function to Class Member Method : 15