3

私はstd::enable_ifにまったく慣れておらず、それをどのように使用するのか疑問に思っています。テンプレートクラスがあります:

template<int a, int b>
class foo {
}

ここで、a + bが10に等しい場合にのみインスタンス化したいのですが、std :: enable_ifを使用してこれを可能にできますか?

2番目の質問:クラスfooにメンバーがいる場合

template<int a, int b>
class foo {
  int c;
}

cが欲しいのは

a = 5. 

std :: enable_ifを使用してこれを行うにはどうすればよいですか?これはstd::enable_ifを使用する正しいケースですか?

4

4 に答える 4

13
template<int a, int b, typename T = typename std::enable_if<a + b == 10>::type>
class foo {
};

これでうまくいくはずです。テンプレートをインスタンス化するときに、3番目のテンプレートパラメータを明示的に指定しないように注意してください。


他の人が述べたようにstatic_assert、はるかに適しています。

于 2012-11-06T22:44:36.783 に答える
12

enable_ifの代わりにstatic_assertを使用してその制約を適用できると思います

template<int a, int b>
class foo {
    static_assert(a+b==10, "a+b is not 10");
};

int main()
{
    foo<5,5> f; // will compile
    foo<1,5> f; // will fail to compile with error: a+b is not 10
    return 0;
}

enable_ifは主に、タイプトレイトに基づいてオーバーロード解決から関数とクラスを条件付きで削除し、さまざまなタイプトレイトに個別の関数オーバーロードと特殊化を提供するために使用されます。

于 2012-11-06T22:45:32.943 に答える
5

C++20を使用

requiresテンプレートに追加するだけで、これを実現できます。

template<int a, int b> requires (a + b == 10)
struct foo {
    int c;
};

int main() {
    foo<3, 7> ok;
    // foo<3, 8> doesnt_compile;
}

このrequires句は、requires句がtrueの場合、これを適切な一致と見なすか、それ以外の場合は無視するかをconstant expression評価trueまたは決定するaを取得します。false

コード:https ://godbolt.org/z/yHh4Et

于 2019-11-15T12:47:03.567 に答える
3

シンプル、使用しないでくださいenable_if

template<bool Ten>
struct Base
{
    int c;
};

template<>
struct Base<false>
{ };

template<int a, int b>
struct foo : Base<a+b == 10>
{
};
于 2012-12-18T15:19:26.653 に答える