ここで、Barで使用されている型がFooから派生していることを(コンパイル時に)確認したいと思います。
#include<type_traits>
#include<utility>
template<class T>
class Foo{};
template<typename T>
std::true_type test(const Foo<T> &);
std::false_type test(...);
template<class T>
class Bar {
static_assert(decltype(test(std::declval<T>()))::value, "!");
};
struct S: Foo<int> {};
int main() {
Bar<S> ok1;
Bar<Foo<int>> ok2;
// Bar<int> ko;
}
がwandboxでそれを参照してください:
あなたはこのような何かを行うことができます。
のタイプを一時的ににバインドすることができます。具体的には、がFoo
の特殊化に由来する場合は、U
になります。したがって、テストするサンプルのようないくつかの関数を宣言(定義不要)してから、static_assert
または他の定数コンテキストで宣言された戻り型を使用することができます。
編集
コメントで@Quentinによって示唆されるように、おそらくそれは、変換コンストラクタと演算子から偽陽性を防ぐために、ポインタと参照を交換する価値があります。
使用できる[型特質](http://en.cppreference.com/w/cpp/types#Type_traits_.28since_C.2B.2B11.29)があります。 –
@Someprogrammerdudeええ、私は少しそれを見た。 is_base_ofはうまくいくかもしれませんが、Fooがテンプレートクラスではなく通常のクラスである場合にのみ使用する方法を知っています。 – Mastrem