2017-06-13 7 views
1

私の質問はthis oneに関連するかもしれませんが、ここでは「部分的に特殊化された非型引数式」がない、またはその関係を理解し​​ていないと思います。非タイプのパラメータパックでC++テンプレートの特殊化が失敗する

次のコードは、MSVC14コンパイラ(CPP11)と内部エラーを生成する:

template<typename T, T... Elmts> 
struct NonTyped 
{ 

}; 

template<typename T> 
struct is_NonTyped_of_type 
{ 
    template<typename TL> 
    static constexpr bool check = false; 

    template<T... Elmts> 
    static constexpr bool check<NonTyped<T, Elmts...>> = true; 
}; 

cout << is_NonTyped_of_type<int>::check<NonTyped<int, 5>> << endl; 

代わりに非型パラメータパックの唯一の非型パラメータを使用すると、期待通りに動作し、これは失敗するであろう。

これは標準で禁止されているのか、定義されていませんか?それは何のルールですか?

回避策はありますか?

ありがとうございました!

編集

solution実際MSVC14では動作しませんでした@StoryTellerによって与えられたが、私たちがここに持っている問題を理解することは非常に便利です。あなたの助けてくれてありがとう、StoryTeller!

答えて

2

Clangはコードを受け取りますが、GCCは受け付けません。変数テンプレートの部分的な特殊化はそのままでいいはずです。実際の計算を行うために、通常のクラステンプレートを使用した試行錯誤した方法にいつでも戻ることができます。

template<typename T> 
class is_NonTyped_of_type 
{ 
    template<typename TL> 
    struct check_impl : std::false_type {}; 

    template<T... Elmts> 
    struct check_impl<NonTyped<T, Elmts...>> : std::true_type {}; 

public: 
    template<typename TL> 
    static constexpr bool check = check_impl<TL>::value; 
}; 
+0

コンパイラがこのような可能性を同じように処理しないという事実に私は困惑しています!ありがとう、私は 'struct'の代わりに' constexpr'を使っていたという事実が、この変な振る舞いの理由だとは知らなかった! – Michel

+2

@Michel - ええ、エイリアス/可変tempaltesの処理はときどき変です。それを証明するために、いくつかの言語の欠陥レポートがあります。最も堅牢な方法は、C++ 03で行うようなクラスを使用することです。次にエイリアス/変数に結果を便利な方法で公開します。標準ライブラリは、新しく追加された型特性を使ってもそれを行います。 – StoryTeller

+0

このコメントは**非常に便利です!どうもありがとうございました! – Michel

関連する問題