gpt4 book ai didi

c++ - 在没有 new 的情况下从未知类调用复制构造函数

转载 作者:行者123 更新时间:2023-11-28 06:46:57 25 4
gpt4 key购买 nike

这是交易:

我有一个模板类 C

template<class T>
class C;

它有一个成员,它基本上是一个指向 T 的重新解释的指针,称为 P(不用担心 P)

P* reint;

我想做的是一个接收T并将其复制到reint中的方法

void foo (T& param) {
new (reint) (param);
}

问题是编译器发出警告,指出 reint 不是我想要删除的 T。我的第一个想法是将 reint 重新解释为 T:

void foo (T& param) {
new (reinterpret_cast<T&>(*reint)) T(param);
}

但是编译器开始给我一个错误提示

invalid conversion from const void* to void*

所以我查了一下,new 是这样定义的:

void* operator new (std::size_t size, void* ptr) throw();

所以出于某种原因,我的转换将 reint 变成了 const void*。

新想法:将 reint 强制转换为 T 并调用复制构造函数。问题:不知道如何从未知类调用复制构造函数。

(也许

reinterpret_cast<T>(*reint).T(param);

?)

你能帮帮我吗?

最佳答案

也许你想要这样的东西:

#include <stdexcept>

struct Data
{
const std::string value;
Data(const std::string& value)
: value(value)
{}
Data(const Data& other) = default;
Data& operator = (const Data& other) = delete;
};

template <typename T>
class Holder
{
public:
Holder() = default;
Holder(const T& data) {
assign(data);
}
~Holder() {
release();
}

void assign(const T& data) {
release();
new (m_data) T(data);
m_valid = true;
}

void release() {
if(m_valid) {
reinterpret_cast<T*>(m_data)->~T();
m_valid = false;
}
}

const T& get() const {
if( ! m_valid) throw std::runtime_error("Invalid");
return *reinterpret_cast<const T*>(m_data);
}

private:
bool m_valid = false;
char m_data[sizeof(T)];
};


#include <iostream>
int main() {
Holder<Data> holder;
holder.assign(Data("Hello"));
const Data& data = holder.get();
std::cout << data.value << '\n';
}

关于c++ - 在没有 new 的情况下从未知类调用复制构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24809252/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com