【问题标题】:How to cast a member variable of class in C++如何在 C++ 中强制转换类的成员变量
【发布时间】:2021-07-22 18:25:39
【问题描述】:

我以这种方式定义了一个类 JsonElement

class JsonElement {
public:
    string key;
    void* value;
    template<typename T>
    void setValue(T val){
        static_cast<T>(value);
        this->value=val;
    }
};

我的问题很简单: 如何将value 的值转换为任何原始类型?

我不想使用这个解决方案:

template<typename T>
class JsonElement {
public:
    string key;
    T value;
};

因为我在创建对象时还不知道value 的类型。

有什么帮助吗?

【问题讨论】:

  • 请不要添加不相关的标签(如 C 语言标签到您的 C++ 问题)。但也请包含相关标签(如 JSON)。
  • 术语旁注:属性是编译器的元信息。您所说的属性在 C++ 领域中称为字段或成员变量。
  • 至于你的问题,不能只投,需要做显式转换。对于 JSON,我建议您将所有值存储为 strings 然后使用例如std::ostringstream 提取字符串并将其“转换”为您想要的类型。
  • en.cppreference.com/w/cpp/utility/anyen.cppreference.com/w/cpp/utility/variant 在这种情况下可能会有所帮助吗?
  • 你为什么使用 C++98?

标签: c++ json class casting attributes


【解决方案1】:

首先,这永远行不通:

    void setValue(T val){
        static_cast<T>(value);
        this->value=val;
    }

static_cast 在编译时强制转换,并且不会强制转换,因为任何对象和void* 之间没有关系(通常)。你需要一个 C 风格的演员表(就像我在这里做的一样,但可以随意使用 a )或 reinterpret_cast 来做到这一点。

固定:

class JsonElement {
public:
    string key;
    void* value;

    template<typename T>
    void setValue(T val) {
        value = (void*)val; //cast our value to a void*, and store it
    }

    template<typename T>
    T getValue() {
        return (T)value; //cast our void* to our value, and return it
    } 
};

我用这个小程序对此进行了测试:

int main() {
    JsonElement j;
    j.setValue<int>(5);
    int i = j.getValue<int>();
    std::cout << i;
}

它按预期打印 5。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-04
    • 1970-01-01
    • 2010-09-30
    • 2019-08-22
    • 2019-08-25
    • 2014-02-16
    • 2015-10-25
    • 2017-10-05
    相关资源
    最近更新 更多