2つの関数を連結する関数を作成するにはどうすればよいですか?

インディアナカーニック

同じ引数のセットで呼び出すことができる2つの関数を連結するジェネリック関数を作成しようとしていますが、少し問題があります。これが私がこれまでに持っているものです(コンパイルされません)

//A functor to store the input functions and call them
template <typename LEFT, typename RIGHT>
struct combine_functions {
  combine_functions(const LEFT &left, const RIGHT &right)
   : left(left), right(right) {}

  template <typename ...ARGS>
  std::enable_if_t<
    //My compiler doesn't have support for C++17 std library so I 
    //found an implementation of callable on SO
    is_callable_v<LEFT, std::decay_t<ARGS>...> &&
    is_callable_v<RIGHT, std::decay_t<ARGS>...>
  > operator()(ARGS... args) const {
    //the return value doesn't matter in my situation and can be 
    //completely discarded
    left(std::forward<ARGS>(args)...);
    right(std::forward<ARGS>(args)...);
  }

private:
  mutable LEFT left;
  mutable RIGHT right;
};

//I should probably have an enable if that checks the arguments 
//are function pointers or functors
template <typename LEFT, typename RIGHT>
combine_functions<
  std::decay_t<LEFT>,
  std::decay_t<RIGHT>
>
operator+(
  const LEFT &left,
  const RIGHT &right
) {
  return {left, right};
}

私が何を達成しようとしているのかわからない場合は、ここにテストがあります。

#include <iostream>
#include "combine functions.hpp"    

struct A {
  void operator()(float &f, int i) {
    std::cout << "running A with float " << f << " and int " << i << '\n';
    f++;
  }
};

struct B {
  void operator()(float &f, int i) {
    std::cout << "running B with float " << f << " and int " << i << '\n';
    f++;
  }
};

struct C {
  void operator()(float &f, int i) {
    std::cout << "running C with float " << f << " and int " << i << '\n';
    f++;
  }
};

int main(int, const char**) {
  A a;
  B b;
  C c;
  auto abc = concat(concat(a, b), c);
  //or
  //auto abc = a + b + c;
  std::function<void(float &, int)> abcFunc = abc;
  float f = 5.0f;
  int i = 9;
  abcFunc(f, i);

  return EXIT_SUCCESS;
}

そして、これが期待される出力です

running A with float 5 and int 9
running B with float 6 and int 9
running C with float 7 and int 9    
  • これをC ++で実装するにはどうすればよいですか?
  • この状況でオーバーロードされた演算子を使用するのは賢明ではありませんか?
  • 「連結」はこの操作の最良の用語ですか?
リチャードホッジス

これが妥当な出発点だと思います。完全な転送により、任意の数の連結と任意の数の引数をサポートします。

#include <tuple>
#include <utility>
#include <iostream>

namespace detail 
{
    template<class Tuple, std::size_t...Is, class...Args>
    void exec(Tuple&& tuple, std::index_sequence<Is...>, Args&&...args)
    {
        using expand = int[];
        void(expand{
            0,
            (std::get<Is>(tuple)(std::forward<Args>(args)...),0)...
        });

    }
}

template<class...Funcs>
auto concat(Funcs&&...funcs)
{
    constexpr auto nof_funcs = sizeof...(funcs);
    return [funcs = std::make_tuple(std::forward<Funcs>(funcs)...)](auto&&...args) mutable
    {
        detail::exec(funcs, 
                     std::make_index_sequence<nof_funcs>(), 
                     std::forward<decltype(args)>(args)...);
    };
};

int main()
{
    auto f1 = [](auto&& arg) { std::cout << arg << std::endl; };
    auto f2 = [](auto&& arg) { std::cerr << arg << std::endl; };

    concat(f1, f2)("Hello, World");
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

可変数の行列を連結する関数を作成するにはどうすればよいですか?

分類Dev

同じ行に2つの関数を連結するにはどうすればよいですか?

分類Dev

2つの行列を比較する誤差関数を作成するにはどうすればよいですか?

分類Dev

任意の文字列を2番目のパラメータと連結する関数を作成するにはどうすればよいですか?

分類Dev

2つの関数から1つだけを作成するにはどうすればよいですか?

分類Dev

Emacsで関数の関連付けリストを作成するにはどうすればよいですか?

分類Dev

2つの非同期JavaScript関数の結果を比較するにはどうすればよいですか?

分類Dev

2つの関数に依存する関数を返すにはどうすればよいですか?

分類Dev

10000個の値を生成する別の関数の2つの値を使用する関数を作成するにはどうすればよいですか?

分類Dev

可変数の引数を持つ関数を作成するにはどうすればよいですか?

分類Dev

Cプログラムを2つの関数で作成するにはどうすればよいですか?

分類Dev

いくつかの条件を待つ関数を作成するにはどうすればよいですか?

分類Dev

整数を含む2つの変数をangularjsで連結するにはどうすればよいですか?

分類Dev

この関数を作成するにはどうすればよいですか?

分類Dev

複数の関係を持つ関連アドレスのSQLで新しい識別子を作成するにはどうすればよいですか?

分類Dev

onclick関数の結果を返す関数を取得するにはどうすればよいですか?

分類Dev

bashで2つの変数の各行を連結するにはどうすればよいですか?

分類Dev

文字列の重複を見つける関数を作成するにはどうすればよいですか?

分類Dev

関数で複数のラムダ関数を作成するにはどうすればよいですか?

分類Dev

別の関数を返す関数を作成するにはどうすればよいですか?

分類Dev

引数付きの関数を作成するDSLを作成するにはどうすればよいですか?

分類Dev

request.POST.get()関数内で連結を使用するにはどうすればよいですか?(django / python)

分類Dev

これを1つの関数として作成するにはどうすればよいですか?

分類Dev

2つの異なる値を取り、Pythonでキーを生成する1つの関数を作成するにはどうすればよいですか?

分類Dev

並行関数と再帰関数の結果を出力するにはどうすればよいですか?

分類Dev

Pythonの関数で関数を作成するにはどうすればよいですか?

分類Dev

複数の構成を実行する関数を作成するにはどうすればよいですか?

分類Dev

2つのデータフレームを使用して変数を計算する関数を作成するにはどうすればよいですか?

分類Dev

「厳密な使用」モードで連鎖関数を作成するにはどうすればよいですか?

Related 関連記事

  1. 1

    可変数の行列を連結する関数を作成するにはどうすればよいですか?

  2. 2

    同じ行に2つの関数を連結するにはどうすればよいですか?

  3. 3

    2つの行列を比較する誤差関数を作成するにはどうすればよいですか?

  4. 4

    任意の文字列を2番目のパラメータと連結する関数を作成するにはどうすればよいですか?

  5. 5

    2つの関数から1つだけを作成するにはどうすればよいですか?

  6. 6

    Emacsで関数の関連付けリストを作成するにはどうすればよいですか?

  7. 7

    2つの非同期JavaScript関数の結果を比較するにはどうすればよいですか?

  8. 8

    2つの関数に依存する関数を返すにはどうすればよいですか?

  9. 9

    10000個の値を生成する別の関数の2つの値を使用する関数を作成するにはどうすればよいですか?

  10. 10

    可変数の引数を持つ関数を作成するにはどうすればよいですか?

  11. 11

    Cプログラムを2つの関数で作成するにはどうすればよいですか?

  12. 12

    いくつかの条件を待つ関数を作成するにはどうすればよいですか?

  13. 13

    整数を含む2つの変数をangularjsで連結するにはどうすればよいですか?

  14. 14

    この関数を作成するにはどうすればよいですか?

  15. 15

    複数の関係を持つ関連アドレスのSQLで新しい識別子を作成するにはどうすればよいですか?

  16. 16

    onclick関数の結果を返す関数を取得するにはどうすればよいですか?

  17. 17

    bashで2つの変数の各行を連結するにはどうすればよいですか?

  18. 18

    文字列の重複を見つける関数を作成するにはどうすればよいですか?

  19. 19

    関数で複数のラムダ関数を作成するにはどうすればよいですか?

  20. 20

    別の関数を返す関数を作成するにはどうすればよいですか?

  21. 21

    引数付きの関数を作成するDSLを作成するにはどうすればよいですか?

  22. 22

    request.POST.get()関数内で連結を使用するにはどうすればよいですか?(django / python)

  23. 23

    これを1つの関数として作成するにはどうすればよいですか?

  24. 24

    2つの異なる値を取り、Pythonでキーを生成する1つの関数を作成するにはどうすればよいですか?

  25. 25

    並行関数と再帰関数の結果を出力するにはどうすればよいですか?

  26. 26

    Pythonの関数で関数を作成するにはどうすればよいですか?

  27. 27

    複数の構成を実行する関数を作成するにはどうすればよいですか?

  28. 28

    2つのデータフレームを使用して変数を計算する関数を作成するにはどうすればよいですか?

  29. 29

    「厳密な使用」モードで連鎖関数を作成するにはどうすればよいですか?

ホットタグ

アーカイブ