BETA

variadic templatesによる可変長引数のメンバ関数にタプルを展開して実行する

投稿日:2020-08-02
最終更新:2020-08-08

概要

std::applyはタプル(std::tupleとは限らない)を展開し、関数の引数に入れて実行する。
例えば、以下のように使える。

constexpr auto f = [](auto a, auto b){ return a + b; };  
constexpr auto tup = std::make_tuple(1, 2);  
static_assert(std::apply(f, tup) == 3);  

さて、これをメンバ関数に使うためには、以下のようにする(C++20)。

struct F {  
    // メンバ関数  
    constexpr auto forward(int a, int b) { return a + b; }  
};  

constexpr auto test() {  
    auto f = F();  
    // タプル  
    auto tup = std::make_tuple(1, 2);  
    // std::bind_frontで第一引数にfを部分適用する。それに展開したいタプルをapplyする  
    return std::apply(std::bind_front(&F::forward, f), tup);  
}  

int main() {  
    static_assert(test() == 3);  
}  

wandboxのリンクはこちら

プレースホルダーを使えばstd::bindでもできる。また、メンバ関数の方に部分適用せず、タプルの方にくっつけてしまう方法もあるが、C++20以降ならstd::bind_frontがこのように使える。

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

@Catminusminusの技術ブログ Frontend/Machine Learning/C++など、興味のあるものについて、小ネタや調査中のこと、備忘録を書いたりします

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう