9

可変個の可変個のテンプレート テンプレート パラメーターを使用する簡単な方法はありますか。たとえば、次の関数シグネチャを考えてみましょう

template<template<typename,size_t...> class Pack, 
  typename T, size_t ... Args>
void foo(const Pack<T,Args...>& a);

Pack2 つの s を渡したい場合は、オーバーロードを行う必要があります

template<template<typename,size_t...> class Pack, 
  typename T, size_t ... Args0, size_t ... Args1>
void foo(const Pack<T,Args0...>& a, const Pack<T,Args1...>& b);

Packここで、さまざまな可変パラメータを持つ可変数のオブジェクトを渡したい場合はどうなるでしょうかArgs0...,Args1...,Args2...

それで、(以下は確かにスケッチ表現です)の線に沿って何かを行う実用的な方法があるかどうかを考えていました.

template<template<typename,size_t...> ... class Pack, typename T,...>  
void foo(const Pack<T,...> ... packs);
4

2 に答える 2

6

通常の可変個引数テンプレートを使用します。

template<typename... Ts>  
void foo(const Ts&... packs) {

}

size_t次に、type とsを抽出する trait を記述します。いくつかのヘルパー エイリアス テンプレートを簡単に追加して、好きなことを行うことができます。

template <typename T> struct extract_args;

template <template <typename, size_t...> class Pack, typename T, size_t... Args> 
struct extract_args<Pack<T,Args...>> {
    using type = T;
    using args = std::index_sequence<Args...>;
};

次にfoo、引数を抽出して、好きなように使用できます。たとえば、パックからstd::tupleすべての を含むを取得するには:T

using all_ts = std::tuple<typename extract_args<Ts>::type...>;
于 2016-07-27T11:48:37.853 に答える
4

Packこのように、引数を再帰的に管理することをお勧めします

#include <array>

template <typename T, std::size_t ... Args>
struct  testS
 { };

void foo ()
 { /* terminal iteration */ }

template <template <typename, std::size_t...> class Pack,
          typename T, std::size_t ... Args, typename ... Packs>  
void foo (const Pack<T, Args...> pack0, Packs ... packs)
 { 
   // do something with pack0

   foo(packs...);
 }

int main()
 {
   foo(testS<int>{}, std::array<long, 5U>{}, testS<char, 7U, 9U, 11U>{});

   return 0;
 }

- - 編集 - -

さまざまな型と可変数のstd::size_tテンプレート パラメーターでの使用を示すために変更された例。

于 2016-07-27T11:53:51.567 に答える