3

可変個引数テンプレート関数がありますf。これは正常にコンパイルされます(を使用してg++ -std=c++11、場合によってはを使用してc++0x):

#include <tuple>

template<int ...>
struct seq { };

template <typename ...T, int ...S>
void f(std::tuple<T...> arg, seq<S...> s) {
  // ... do stuff
}

int main() {
  f<int>(std::tuple<int>(10), seq<0>());
  return 0;
}

コンパイラは、動作するものを自動的に入力int ...Sします。

ただし、整数引数を手動で提供することはできないようです。

int main() {
  f<int, 0>(std::tuple<int>(10), seq<0>());
  return 0;
}

出力:

/tmp/t.cpp:関数内'int main()':/tmp/t.cpp:12:42:エラー:
'f(std :: tuple、seq <0>)'<の呼び出しに一致する関数がありませんbr> /tmp/t.cpp:12:42:注:候補は:/tmp/t.cpp:7:6:注:
template void f(std :: tuple <_TElements ...>、
seq)/ tmp /t.cpp:7:6:注:テンプレート引数の推定
/置換に失敗しました:

技術的には、テンプレート関数に提供される可変個引数テンプレートパラメータパックは1つだけである必要があることを読んだと思います(最初のケースでは、コンテキストによって完全に決定されます)。

デバッグのために、GCCに...Stostderrまたはに使用される拡張を出力する方法はありstdoutますか?最初にコンパイルしないときに、このようなものをデバッグするのに非常に役立ちます。

4

1 に答える 1

4

2 つのテンプレート引数パックを手動で指定する方法がわかりません。テンプレート パックには任意の数の引数が含まれる可能性があるため、最初の引数を停止し、2 番目の引数を開始するタイミングをコンパイラが知る方法はありません。ただし、自動または部分的に自動の控除は機能しているようですが、これがg ++の寛大さなのかどうかはわかりません...

あなたが実際に何をしようとしているのかはわかりませんが、両方のテンプレート パックを同時に必要としないことは間違いありません。間接的なレイヤーを 1 つ導入することもできます。

template <typename ... Tuple_Elements>
void do_something_with_single_value(std::tuple<Tuple_Elements...> arg, int s) {
  // ... do stuff 
}

template <typename Tuple_Type, int ...S>
void f(Tuple_Type arg, seq<S...> s) {
  // ... do stuff which needs all S at the same time
  // ... call do_something_with_single_value in compile time loop to access tuple elements
}

おそらく、あなたの署名は、あなたの関数があまりにも多くの責任を持っているというヒントです. 明確な責任を持つ小さな機能を作成するようにしてください。

T と S について推定された引数を出力する方法がありますが、コンパイラが一致を判断できる場合のみです。このためには、コンパイル時にエラーを発生させる必要があります。

template <typename ...T, int ...S>
void f(std::tuple<T...> arg, seq<S...> s) {
static_assert(std::tuple_size<std::tuple<T...>>::value < 0, "Provoked error message");
    // ... do stuff
}

これにより、作業例で次の出力が生成されます。

stack.cpp: In function ‘void f(std::tuple<_Elements ...>, seq<S ...>) [with T = {int}, int ...S = {0}]’:
stack.cpp:15:34:   instantiated from here
stack.cpp:10:2: error: static assertion failed: "Provoked error message"
于 2013-01-03T11:46:20.460 に答える