8

指定されたweak_ptrが有効な場合に呼び出されたときにラムダ/std::関数を実行するヘルパー関数を作成しようとしています。現在、次のコードは機能しますが、残念ながら、テンプレート パラメーターを定義する必要があります。自動テンプレート引数推定でこれを行う方法を探しています。

template <typename DependentType, typename... ArgumentTypes>
auto make_dependent(std::weak_ptr<DependentType>& dependent, std::function < void(ArgumentTypes...)> functor) -> decltype(functor)
{
    return [&dependent, functor] (ArgumentTypes... args)
    {
        if (!dependent.expired()) {
            functor(args...);
        }
    };
};

std::function <void(ArgumentTypes...)>理想的には、を一般的なテンプレート パラメーターに置き換えたいのFunctorTypeですが、 から引数を抽出する方法がわかりませんFunctorType。上記のコードは機能します。以下のコードは理論上のものです。

template <typename DependentType, typename FunctorType>
auto make_dependent_ideal(std::weak_ptr<DependentType>& dependent, FunctorType functor) -> decltype(std::function<return_value(functor)(argument_list(functor))>)
{
    return[&dependent, functor](argument_list(functor) args)
    {
        if (!dependent.expired()) {
            functor(args...);
        }
    }
}

このようなことをする方法はありますか?

4

3 に答える 3

2

C ++ 14であなたの問題を解決する方法は次のとおりです。

template<typename DependentType, typename FunctorType>
auto make_dependent(std::weak_ptr<DependentType> &dependent, FunctorType functor) {
  return [&dependent, functor](auto &&...args) {
    if (!dependent.expired())
      functor(std::forward<decltype(args)>(args)...);
  }
}

ここでは 2 つの C++14 機能を使用しています。

  • の推定戻り値の型make_dependent
  • 内部を呼び出すための完全な転送を備えた可変引数ジェネリック ラムダfunctor

編集:元のコードが行ったように、上記のコードは参照によってキャプチャdependentします。それは本当にあなたが望むものですか?

于 2013-08-01T06:10:37.273 に答える
1

プロキシ トレイト クラスを使用して、戻り値の型と引数を単一のテンプレート パラメーターから個別に抽出できます。Traitクラスは静的関数を使用して、dependent_func返すラムダを作成します。

template <typename DependentType, typename FunctorType>
struct Trait {};

template <typename DependentType, typename ReturnType, typename... ArgumentTypes>
struct Trait<DependentType, std::function<ReturnType(ArgumentTypes...)>> {
    static std::function<ReturnType(ArgumentTypes...)> dependent_func(const std::weak_ptr<DependentType>& dependent, std::function<ReturnType(ArgumentTypes...)>& functor) {
        return [&dependent, &functor] (ArgumentTypes... args) {
            if (!dependent.expired()) {
                return functor(args...);
            }
        };
    }
};

template <typename DependentType, typename FunctorType>
auto make_dependent_ideal(std::weak_ptr<DependentType>& dependent, FunctorType& functor) -> decltype(Trait<DependentType, FunctorType>::dependent_func(dependent, functor)) {
    return Trait<DependentType, FunctorType>::dependent_func(dependent, functor);
}

この方法でテンプレート引数を解析する方法の詳細については、次の質問を参照してください: C++ parsing function-type template argument

于 2013-07-31T00:42:20.857 に答える