タイトルが意味をなすかどうかはわかりませんが、例は実際には非常に簡単です。
// A converter struct with a generic constructor.
template <template <typename ...> class TT>
struct converter
{
template <typename ... Args>
converter(const TT<Args ...> &);
};
// A few class templates.
template <typename T>
struct foo {};
template <typename T, typename U>
struct foo2 {};
template <typename ... Args>
struct foo_variadic {};
template <typename Arg0, typename ... Args>
struct foo_variadic2 {};
int main()
{
// All these compile.
converter<foo>(foo<int>{});
converter<foo2>(foo2<int,double>{});
converter<foo_variadic>(foo_variadic<>{});
converter<foo_variadic>(foo_variadic<int>{});
converter<foo_variadic>(foo_variadic<int,double>{});
// This will not compile.
// converter<foo_variadic2>(foo_variadic2<int>{});
}
私は GCC 4.8.1 と clang 3.3 で試しました。エラー メッセージは少し異なりますが、すべて5 行目 (およびその後の候補リストからArgs
のコンストラクターの除外) で推測する問題を示しています。converter
foo_variadic2
は、他の s と比べてどのように特別または異なるfoo
のですか?
is_instance_of
(記録として、テンプレート クラスのインスタンスを検出する型特性を実装しようとしています)
アップデート
これで、セットアップの GCC 4.8.3 と 4.9.1 の両方がこれを受け入れます。clang 3.4.2 はまだ吠えています。