我维护一个名为
Property
的结构,它有两个数据成员 title & value
。标题是 string_view
,值是 int
。另一个类 Foo
具有类型 Property
的数据成员。在下面的代码中我只提到了 Foo
中的两个属性,但实际上它会超过 10
。我维护不同属性标题的硬编码字符串,并且需要在运行时分配value
数据成员。
由于我已经知道不同属性的标题,我正在考虑在编译时创建
Foo
对象,并在编译时本身分配每个属性的标题。在运行时它只会计算 value
。这样会减少我的运行时开销。
考虑下面的代码,它会编译并创建我想要的输出。但这是否正确,或者是否有更好的方法来处理这个问题?我正在使用 C++20。
constexpr std::string_view one = "prop1";
constexpr std::string_view two= "prop2";
struct Property
{
std::string_view title;
int value;
constexpr Property() :title{""}, value{0}{}
};
struct Foo
{
int v1{};
int v2{};
Property prop1;
Property prop2;
constexpr Foo(int x = 0 , int y = 0) : v1{x}, v2{y}
{
prop1.title = one;
prop2.title = two;
}
void setValue_Prop1(int a)
{
prop1.value = a;
}
void setValue_Prop2(int a)
{
prop2.value = a;
}
};
int main()
{
constexpr Foo foo{ 1,2 };
static_assert(foo.prop1.title == "prop1");
static_assert(foo.prop2.title == "prop2");
const_cast<Foo*>(&foo)->setValue_Prop1(10); (*I cannot simply call foo.setValue_Prop1(10) as foo is constexpr)
const_cast<Foo*>(&foo)->setValue_Prop2(20);
std::cout << foo.prop1.title << " " << foo.prop1.value << std::endl;
std::cout << foo.prop2.title << " " << foo.prop2.value << std::endl;
}
由于
title
似乎“固定”到该属性,您可以将其模板化:
constexpr char one[] = "prop1";
constexpr char two[] = "prop2";
template <auto Title> struct Property
{
constexpr std::string_view title() const { return Title; }
int value = 0;
};
struct Foo
{
int v1{};
int v2{};
Property<one> prop1;
Property<two> prop2;
constexpr Foo(int x = 0, int y = 0) : v1{x}, v2{y} {}
void setValue_Prop1(int a) { prop1.value = a; }
void setValue_Prop2(int a) { prop2.value = a; }
};