2017-12-09 36 views
8

this answerを調べているうちに、パラメータパックを取るテンプレートは、特定の数のパラメータを持つテンプレートを必要とするテンプレートでは受け入れられないことがわかりました。<typename...>テンプレートに一致していない<typename>に欠陥がありますか?

これは、テンプレートが任意の数のパラメータを取ることができる場合、特定の数にマップできる必要があるため、これは問題であると思われます。なぜこれが許されないのか説明できる言語弁護士はいますか?私はもちろん、この正確なシナリオでそれを使用することはありません

template <typename...Ts> 
using pack = void; 

template <template <typename> class> 
using accept_template = int; 

accept_template<pack> value = 0; 

:ここ

は簡単な例です。これは、ある方法で渡されたテンプレートを使用する別のテンプレートにテンプレートを渡すために使用されます。リンクした私の答えで、私は回避策を述べましたが、私はまだこれが欠陥だと感じています。

答えて

12

この制限は、P0522の結果として緩和されました。テンプレートテンプレート引数がテンプレートテンプレートパラメータとどのように一致するかを処理する新しい規則が導入されています。その結果、論文から:

template<class T, class U = T> class B { /* ... */ }; 
template <class ... Types> class C { /* ... */ }; 
template<template<class> class P> class X { /* ... */ }; 


X<B> xb; // OK, was ill-formed: 
     // default arguments for the parameters of a template argument are ignored 

X<C> xc; // OK, was ill-formed: 
     // a template parameter pack does not match a template parameter 

あなたの例はC++ 14でコンパイルできませんが、C++ 17でコンパイルされます。

+0

便利な機能はありません。 – Adrian

+0

@Adrianこの問題の例は、GCC 7.2でC++ 17モードで受け入れられています(使用するオプションがある場合)。 – hvd

+0

これは欠陥として見つかったことを知りました。 :) – Adrian

関連する問題