我々はテンプレートの別名と専門
template<typename T>
struct Foo
{
};
template<typename T>
struct Bar
{
};
template< template<typename T> class C >
struct Pack
{
template<typename T>
using Container = C<T>;
};
を持っていると仮定すると、我々はFoo
のための専門を持っている場合は同じものとして扱われることをFoo
とPack<Foo>::Container
を想定していますか?つまり、
template< template<typename T> class C >
struct IsFoo : std::false_type
{
};
template<>
struct IsFoo<Foo> : std::true_type
{
};
static_assert(IsFoo<Foo>::value, "Only foos!");
static_assert(IsFoo< Pack<Foo>::Container >::value, "Only foos!"); // ???
static_assert(IsFoo< Pack<Bar>::Container >::value == false, "Not a foo!");
この2番目のアサーションは正しいですか?期待される行動は何ですか?ヘック、私も有効にしようとしているものですか?
私は3つのコンパイラでそれをテストしましたが、私は異なる結果を得ました。 MSVCとCLangについては、Foo
とPack<Foo>::Container
は同じものではないと思われますが、これはまさに私が望んでいたので、涼しいです。GCC disagrees
だから、誰が正しいですか?
PS:タイトルや質問の本文に正しい用語を使用しているかどうかはわかりません。提案や訂正は大歓迎です。宣言がエイリアス宣言 (条項7)である
私はテンプレートの特殊化は、タイプまたは値のためであると思いました。ここで 'Foo'は型でも値でもないテンプレートです。 +1の質問です。 – zahir
[CWG1286](http://wg21.link/cwg1286)。 – cpplearner
'IsFoo'のテンプレートパラメータがテンプレートではなくtypenameであるようにサンプルを変更すると、MSVCとGCCの両方が元の例のGCCと同じ出力になります。 (http://coliru.stacked-crooked.com/a/f3052a75286f82e2参照)。 – jtedit