次のシナリオを考えます。
class A {};
class B : public A {};
class C : public A {};
class D : public A {};
template<typename T/*std::enable_if and std::is_base_of here*/> class X {};
Xを宣言するとき
次に、typename T
を強制的にAのサブクラスにするように制約したいと思います。そうしないと、コンパイルエラーが発生します。
int main()
{
X<B> x1 = {}; //should work;
X<C> x2 = {}; //should work;
X<D> x2 = {}; //should work;
X<std::string> = {}; //should generate a compiling error;
X<int> = {}; //should generate a compiling error;
};
使用するための正しい構文は次のとおりenable_if
です。
template<typename T, std::enable_if_t<std::is_base_of_v<A, T>, bool> = true>
class X {};
そして今、ifA
がT
then std::is_base_of_v<A, T>
istrue
とstd::enable_if_t
becomesのベースであり、それにbool
値を与えますtrue
。A
がのベースでない場合T
、条件はfalseでstd::enable_if_t
結果はゼロになり、テンプレートは実行可能な候補として破棄され、コンパイラエラーが生成されます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加