ホームページ > バックエンド開発 > C++ > 可変引数テンプレート関数で `decltype` を使用して引数の合計を計算する方法

可変引数テンプレート関数で `decltype` を使用して引数の合計を計算する方法

DDD
リリース: 2024-11-11 03:22:02
オリジナル
936 人が閲覧しました

How to Use `decltype` with a Variadic Template Function to Calculate the Sum of its Arguments?

可変長引数テンプレート関数で decltype を使用するトレーリング戻り型

可変長引数を使用して引数の合計を累積する関数を作成しようとする場合テンプレートと後続の戻り値の型の構文を使用すると、問題が発生します。具体的には、3 つ以上の引数を持つ関数に対してコンパイラでエラーが発生する可能性があります。これは、可変個引数関数テンプレートは戻り値の型を指定した後にのみ宣言されているとみなされ、decltype の sum が可変個引数関数テンプレート自体を参照できない状況が発生するためです。

潜在的な回避策としては、カスタム特性クラスを使用して、 decltype 式内の再帰呼び出しを回避します:

template<class T> typename std::add_rvalue_reference<T>::type val();

template<class T> struct id{typedef T type;};

template<class T, class... P> struct sum_type;
template<class T> struct sum_type<T> : id<T> {};
template<class T, class U, class... P> struct sum_type<T,U,P...>
: sum_type< decltype( val<const T&amp;>() + val<const U&amp;>() ), P... > {};
ログイン後にコピー

これにより、元のプログラムの decltype を typename sum_type::type に置き換えることができ、コンパイルを成功させることができます。

合計が演算の順序 (例: a (b c)) に従うことを保証するために、sum_type の最後の特殊化を次のように変更できます。

template<class T, class U, class... P> struct sum_type<T,U,P...>
: id<decltype(
      val<T>()
    + val<typename sum_type<U,P...>::type>()
)>{};
ログイン後にコピー

以上が可変引数テンプレート関数で `decltype` を使用して引数の合計を計算する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート