2017-05-22 9 views
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 
+0

「case」は、評価されたラベルをコンパイルする時間を指していると考えてください。だから、あなたはそれをすることはできません。 –

+0

@πάνταῥεῖ:「評価されたコンパイル時間」はまさに私たちが 'constexpr'を持っている理由です。 – MSalters

答えて

3

何かを行うことができますが、コンストラクタはconstexprすることができ、クラスが継承することができます提供しました。 Some_Classのメンバーとしてstatic constexpr Some_Classを持つことはできないため、派生クラスを使用して回避します。

#include <iostream> 

namespace detail 
{ 
    class Base_Class //Has the functionality 
    { 
    private: 
     int _value; 
    public: 
     constexpr Base_Class(int value) : _value(value) {} 
     constexpr int getValue() const 
     { 
      return _value; 
     } 
    }; 
} 

//Inherits functionality, has static members 
class Some_Class : public detail::Base_Class 
{ 
public: 
    using Base_Class::Base_Class; 
    static constexpr Base_Class ONE{1}; 
    static constexpr Base_Class TWO{2}; 
}; 

int main() 
{ 
    int value = 1; 
    switch (value) 
    { 
    case Some_Class::ONE.getValue(): 
     std::cout << "Do thing 1" << std::endl; 
     break; 
    case Some_Class::TWO.getValue(): 
     std::cout << "Do thing 2" << std::endl; 
    } 
    return 0; 
} 
関連する問題