2017-06-06 14 views
0
私はC++で書かれたソフトウェア用のプラグインを書いて

、ここにプラグインが定義されてい抜粋ですnumArgumentsを使用してstd::function<int(msParam_t*, msParam_t*, ruleExecInfo_t*)>パラメータパックを動的に生成することができます。ここで、numArgumentsmsParam_t*引数の数を表します。動的に作成し、パラメータパックにはstd ::タプルを拡大

私はこの以下を実装することで可能であるかもしれないことを発見しましたのでafter some research、(特にテンプレート付き)C++専門家ではない:

  • のstd ::タプル
  • STD: :tuple_cat
  • のstd :: index_sequence
  • のstd :: make_integer_sequence

しかし、私は実際にこれを実装する方法を知りません。私が見つけた例は理解しづらいものでした。私は自分のニーズにそれらを翻訳することができませんでした。誰でもヒント、短い例、またはこれがどのように機能するかについての参考文献を提供できますか?どんな情報でも大歓迎です!

+1

はコンパイル時に知られている 'numArgument'のですか? –

+0

これは動的に行うことはできません。これはコード生成を伴いますが、静的に生成することも、静的に生成することもできます。 add_operationのタイプは何ですか? – user1937198

+0

@DavideSpataro - いいえ、numArgumentは実行時に定義されます。 –

答えて

1

私は次のことがあなたが求めているものであるかどうかわかりませんが、あなたが望むのはMyMicroserviceが取る引数の数に基づいてstd::functionの正しいテンプレートパラメータを生成できていると思います変数numParametersに格納されます。

このような場合は、それらをまったく書き込むことを省略し、decltypeを使用して、コンパイラに書き込ませることができます。

int myMicroservice1(int a,int b, int c){ 
    return a+b+c; 
} 

int myMicroservice2(int a,int b, int c,int d){ 
    return a*b*c-d; 
} 

int myMicroservice3(int a,int b, int c,int d,int e, int f){ 
    return a*b*c+e+f; 
} 


template<typename... types_t> 
void add_operation(const std::string & _op, std::function< int(types_t...)> _f){ 

} 

int main() { 
    add_operation("blabla",std::function<decltype(myMicroservice1)>(myMicroservice1)); 
    add_operation("blabla",std::function<decltype(myMicroservice2)>(myMicroservice2)); 
    add_operation("blabla",std::function<decltype(myMicroservice3)>(myMicroservice3)); 
    return 0; 
} 
+0

私は、ランタイム整数からパラメータパックを動的に構築することができたとしても、「MyMicroservice」引数は依然として静的であることに気づきました。異なる引数のセットごとに定義された関数が必要です。私はあなたの答えを感謝し、それは私のアイデアの欠陥を特定するのを助けた。 –

0
template<typename T> 
struct toFunc; 

template<typename...T> 
struct toFunc<std::tuple<T...>> 
{ 
    using type = std::function<void(T...)>; 
}; 

int main(int argc, char **argv) { 

    using t = std::tuple<int, int, int>; 
    using func = toFunc<t>::type; 
    auto f = func([](int a, int b, int c){std::cout << a << b << c << std::endl;}); 
    f(1, 2, 3); 
    return 0; 
} 

toFunc typetraitは、タプルを関数型に変換します。あなたがそれを望むかどうかは分かりません。あなたは多分 http://en.cppreference.com/w/cpp/utility/apply

を探すために必要とするか、またはあなたがこの実装を使用することができます引数で呼び出したい場合:

namespace detail 
{ 
      template <unsigned int N> 
      struct for_each_t_idx 
      { 
       template <template<std::size_t> class Functor, typename... ArgsT> 
       static void exec(const std::tuple<ArgsT...>& t, Functor<N> func) 
       { 
        for_each_t_idx<N - 1>::exec(t, func); 
        func<N - 1>(t); 
       } 
      }; 

      template <> 
      struct for_each_t_idx<0> 
      { 
       template <template<std::size_t> class Functor, typename... ArgsT> 
       static void exec(const std::tuple<ArgsT...>& t, Functor<0> func) 
       { 
       } 
      }; 
} 

    template <template<std::size_t> class Functor, typename... ArgsT> 
    void for_each_idx(const std::tuple<ArgsT...>& t, Functor<sizeof...(ArgsT)> func) 
    { 
     detail::for_each_t_idx<sizeof...(ArgsT)>::exec(t, func); 
    } 

これは、タプルの各要素に対して与えられた関数を呼び出します。

関連する問題