0
ケースツリーはコンパイル時に作成されるため、getValue()
の結果はswitch
ステートメントで使用できないことを理解します。静的オブジェクトメンバのスイッチ準拠定数を定義する方法はありますか?
私が持っているのは、コンストラクタから実行時に定数値が設定されたstatic const
のメンバを含むクラスです。設定する値は、コンパイル時に常にわかります。
これらのオブジェクトをタイプセーフな方法で定義し、それらをクラスの静的メンバーとして保持するには、テンプレートなどのソリューションを使用できますか?
この場合、enum
は、次の例のint
などの異なる種類のスイッチをオンにしたいとは限りません。
例:
#include <iostream>
using namespace std;
class Some_Class {
private:
int _value;
public:
Some_Class(int value) {
_value = value;
}
int getValue() const {
return _value;
}
static const Some_Class ONE;
static const Some_Class TWO;
}; // class
const Some_Class Some_Class::ONE(1);
const Some_Class Some_Class::TWO(2);
int main() {
int value = 1;
switch (value) {
case Some_Class::ONE.getValue():
cout << "Do thing 1" << endl;
break;
case Some_Class::TWO.getValue():
cout << "Do thing 2" << endl;
}
return 0;
}
これは、前述の問題のために動作しません似た
main.cpp(29) : error C2051: case expression not constant
main.cpp(32) : error C2051: case expression not constant
「case」は、評価されたラベルをコンパイルする時間を指していると考えてください。だから、あなたはそれをすることはできません。 –
@πάνταῥεῖ:「評価されたコンパイル時間」はまさに私たちが 'constexpr'を持っている理由です。 – MSalters