テンプレートパラメータの値に基づいて関数内の文を条件付きでコンパイルできますか?例:(!Tが使用その後、すべてのタイプが定義された=演算子を持っている必要があるため)C++テンプレートパラメータ値に基づいてメンバ関数の定義を変更する
template<typename T, bool chk>
class subject
{
public:
// the ideal case
void doSomething(T new_val)
{
if(chk)
{
if(new_val != val)
//do_something only if new_val is different from val
}
else
{
//do_something even if new_val and val are equal
}
}
//or if that's not possible, if chk = 0 use this method
void doSomething(T new_val)
{
//do_something even if new_val and val are equal
}
// and if chk = 1 use this method
void doSomething(T new_val)
{
if(new_val != val)
//do_something only if new_val is different from val
}
T val;
};
キャッチがCHKの値に基づいており、私も機能にコンパイル声明if(new_val!=val)
を望んでいません。
私は、このアプローチの欠点の一つは、CHKが0または1(たとえばwatch(foo<int>)
)であれば気にしない関数を定義することはできないのでfoo<int,0>
とfoo<int,1>
が異なるクラスであるということですね。
私が特に見ているアプリケーションはオブザーバであり、一部のタイプでは、値が実際に変更された場合のみオブザーバに通知し、オブザーバには常に通知する必要があります。 !=演算子を定義する必要はありません)。
これは2つのクラスを別に持つことなく可能ですか?
これは素晴らしいことです。私はenable_ifを見ていましたが、IMOではcppreference.com上のドキュメントは理解できず、これにはあまり適していないように見えました(SFINAEの仕組みが分かりません) –
実際にはあなたはenable_if_tがあなたにちょうどenable_ifを超えて与えるものとそれがどのように働くかの簡単な説明を追加するのに気をつけますか?もう一度私は見てきましたが、少し不足しています。 –
@schrödinbugここではたくさんの例が見つかります。私ができることよりも良く説明されました! ;-) – skypjack