在 C++ 中为同一对象在编译时和运行时分配部分值

问题描述 投票:0回答:1

我维护一个名为

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;
}
c++ c++20
1个回答
0
投票

由于

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; }
};

演示

© www.soinside.com 2019 - 2024. All rights reserved.