パラメータパックと非型テンプレート値を使用して部分的なテンプレートの特殊化を実行するにはどうすればよいですか?

mutableVoid

可変個引数テンプレートコンパイル時std :: array使用しようとしているときに、次の部分的なテンプレートの特殊化を作成しました。

template <typename array_wrapper> struct Test1;
template <std::size_t... A> struct Test1<any_type<std::array<std::size_t, sizeof...(A)>{A...}>> {}; //(2)

これは、<Expression> has incomplete type and cannot be definedテンプレートの特殊化を部分的に試みたときに、それを使用しようTest1としたTest2ときにコンパイルエラーが発生ます。したがって、私が理解しているように、使用法(3)は定義(2)と一致しません。

int main() {
  Test1<any_type<std::array<std::size_t, 2>{1, 2}>> a; // (3)
}

なぜそうなのかわかりませんが。例を試してみると、これは、any_type構造内のパラメーターパックのコンテンツを「非表示」にしているときに発生することがわかります。

#include <array>

template <auto f> struct any_type;

template <typename array_wrapper> struct Test1;
template <std::size_t... A> struct Test1<any_type<std::array<std::size_t, sizeof...(A)>{A...}>> {};

template <typename array_wrapper> struct Test2;
template <int... A> struct Test2<any_type<std::get<0>(A...)>> {};

template <typename array_wrapper> struct Test3;
template <int A> struct Test3<any_type<A>> {};

int main() {
  //Test1<any_type<std::array<std::size_t, 2>{1, 2}>> a;
  //Test2<any_type<1>> b;
  Test3<any_type<1>> ok;
}

Test1とTest2は同じエラーで失敗し、Test3は正常に動作します。最初の2つのケースで、部分的なテンプレートの特殊化が「失敗」するのはなぜですか?私が理解しているように、宣言は構造体を使用するための「インターフェース」を提供し、特殊化の引数は実際に提供される引数と一致します。

コードコードはここにあります

コンパイルオプション:私はを使用g++-10.0 (GCC) 10.0.1 20200124 (experimental)してコンパイルしg++ -std=c++2a file.ccます。型以外のテンプレートパラメータを使用するため、c ++ 2aが必要です。

バリー

テンプレート引数を推測できるパターンの有限セットがあります。テンプレートの非型引数の場合、そのセットは([temp.deduct.type] / 8から):

  • type[i]
  • template-name<i> (template-nameはクラステンプレートを指します)
  • TT<i>

... 以上です。あなたTest3は2番目のフォームに一致し、他の2つはまったく一致しません。

このTest2例がどのように機能するかはまったく明らかではありませんこのTest1例は、C ++ 20以降、型以外のテンプレートパラメータの使用が急増しているため、検討したいものかもしれませんが、現在有効なものではありません。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ