読者です 読者をやめる 読者になる 読者になる

Haruyuki Mohri

毛利春幸のブログです。

Berlin C++11 lambdaでstd::function<>とTFunc<>両方使う方法

std::function<>とTFunc<>両方を同じ関数でセットできるようにする。

std::function<>用

#include <functional>
template<typename T, bool=true >
int __fastcall func2(T fn1, int i1, int i2)
{
    return fn1(i1, i2);
}

TFunc<>用

template<typename T, bool=false>
int __fastcall func2(_di_TFunc__3<int, int, int > fn1, int i1, int i2)
{
    return (*fn1).Invoke(i1, i2);
}

共通で呼ぶ関数

#include <type_traits>
template<typename T>
unsigned int __fastcall TForm1::func1(T fn1)//std::function<>とTFunc__3<>両方対応させる
{
    int result_{0};
    for (int i = 0; i < 10; i++)
    {
        result_ = func2<T,  std::is_same<T, std::function<int(int, int)> >::value>(fn1, i, result_);
    }
    return  static_cast<unsigned int>(result_);
}

呼び方

__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    Memo1->Clear();
    ///std::function<>を使って実行
    unsigned int i3{func1<std::function<int(int, int)> >([](int i1, int i2)->int
    {
        return i1 + i2;
    })};

    ///TFunc__3<>を使って実行
    unsigned int i4{func1<_di_TFunc__3<int, int, int > >([](int i1, int i2)->int
    {
        return i1 + i2+ i2;//上とは若干違う内容
    })};
    OutputDebugString(Format(L"%d, %d", ARRAYOFCONST((i3, i4)) ).c_str() );
    Memo1->Lines->Append(Format(L"std::function<int(int, int)> = %d", ARRAYOFCONST((i3))));
    Memo1->Lines->Append(Format(L"TFunc__3<int, int, int > = %d", ARRAYOFCONST((i4))));

}

同じ関数名で型を変えるとそれぞれに対応した関数に飛んでく。

f:id:mojeld:20160819195533j:plain

gist.github.com