有没有办法为静态对象成员定义一个符合开关的常量?
Is there a way to define a switch-compliant constant for static object members?
我知道我不能在 switch
语句中使用 getValue()
的结果,因为案例树是在编译时构建的。
我有一个 class,它包含 static const
个成员,这些成员在运行时从构造函数中设置了常量值。要设置的值在编译时总是已知的。
是否可以使用模板或其他解决方案以类型安全的方式定义这些 const
对象并将它们作为 class 的静态成员?
请注意,在这种情况下我不想要 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
可以做类似的事情,前提是构造函数可以是 constexpr
并且 class 可以被继承。由于我们不能将 static constexpr Some_Class
作为 Some_Class
的成员,因此我们使用派生的 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;
}
我知道我不能在 switch
语句中使用 getValue()
的结果,因为案例树是在编译时构建的。
我有一个 class,它包含 static const
个成员,这些成员在运行时从构造函数中设置了常量值。要设置的值在编译时总是已知的。
是否可以使用模板或其他解决方案以类型安全的方式定义这些 const
对象并将它们作为 class 的静态成员?
请注意,在这种情况下我不想要 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
可以做类似的事情,前提是构造函数可以是 constexpr
并且 class 可以被继承。由于我们不能将 static constexpr Some_Class
作为 Some_Class
的成员,因此我们使用派生的 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;
}