C++ WriteProcessMemory std::vector<;任何>;自定义任何类

C++ WriteProcessMemory std::vector<;任何>;自定义任何类,c++,c++17,C++,C++17,如何将写进程内存与std::vector一起使用 如果我使用std::vector,这是有效的 我不确定这个类在使用.Data()时是否返回正确的信息 classany { 私人: 结构基{ 虚拟~base(){} 虚拟基*clone()常量=0; }; 模板 结构数据库{ 数据(T常量和值):值{(值){} base*clone()常量{返回新数据(*this);} T值; }; 基础*ptr_3;; 公众: 模板any(T常量和值):ptr(新数据(值)){} any(any const&o

如何将写进程内存与std::vector一起使用

如果我使用std::vector,这是有效的

我不确定这个类在使用.Data()时是否返回正确的信息

classany
{
私人:
结构基{
虚拟~base(){}
虚拟基*clone()常量=0;
};
模板
结构数据库{
数据(T常量和值):值{(值){}
base*clone()常量{返回新数据(*this);}
T值;
};
基础*ptr_3;;
公众:
模板any(T常量和值):ptr(新数据(值)){}
any(any const&other):ptr_(other.ptr_->clone()){}
任意运算符=(任意常量和其他){
任何(其他)掉期(*本);
归还*这个;
}
~any(){删除此->ptr;}
void swap(任意和其他){std::swap(this->ptr_,other.ptr_)}
模板
T&get(){
返回动态强制转换(*this->ptr)。值;
}
};
模板
size\u t vectorsizeof(常量类型名称std::vector&vec)
{
返回sizeof(T)*向量大小();
}
std::向量args{100,1.1f};
WriteProcessMemory(hProc、pMemory、args.data()、vectorsizeof(args)、nullptr)
必须有一种简单的方法在带有写进程内存的向量中使用std::any

不,没有

忽略
std::any
对当前存储的值所做的操作,
std::any
间接存储其值(好像)。这意味着它更像一个
向量
;它存储一个指向它在堆上分配的对象的指针(除了
T
对类型隐藏并且只存储其中一个对象)。因此,复制
any
本身的位不会(必然)使它存储的
T
可见;您正在(可能)复制指针,而不是它指向的对象

此外,由于许多原因,
任何
都不能跨这样的流程交付。即使您可以访问由
any
存储的对象的字节范围,您也无法使用它在另一侧重建
any
。即使你可以,你也必须传输
type\u索引
,它代表
any
中存储的类型。这是不跨过程兼容的;一个进程中特定类型的类型索引值可能与另一个进程中相同类型的索引不同

你想要的东西根本行不通。你必须使用其他的东西,其他的东西必须知道它传输的数据类型

必须有一种简单的方法在带有写进程内存的向量中使用std::any

不,没有

忽略
std::any
对当前存储的值所做的操作,
std::any
间接存储其值(好像)。这意味着它更像一个
向量
;它存储一个指向它在堆上分配的对象的指针(除了
T
对类型隐藏并且只存储其中一个对象)。因此,复制
any
本身的位不会(必然)使它存储的
T
可见;您正在(可能)复制指针,而不是它指向的对象

此外,由于许多原因,
任何
都不能跨这样的流程交付。即使您可以访问由
any
存储的对象的字节范围,您也无法使用它在另一侧重建
any
。即使你可以,你也必须传输
type\u索引
,它代表
any
中存储的类型。这是不跨过程兼容的;一个进程中特定类型的类型索引值可能与另一个进程中相同类型的索引不同


你想要的东西根本行不通。你必须使用其他东西,而且其他东西必须对它传输的数据类型有一些了解。

这个->
std::any_cast(你的\u any_的实例在这里)
@Ruks,如果any项不是LPVOID,它就不起作用,我需要一种方法来自动执行,这样我仍然可以使用
args.data()
您需要一种方法来知道
std::any
类型是否持有
LPVOID
对象。该类不共享其当前持有的类型。尝试创建一个作用域枚举类型或类似的类型来跟踪它当前持有的类型,或者如果适合您的问题,可以使用
std::variant
。嗯,
std::any
确实存储它当前持有的类型。从理论上讲,如果
std::any
存储了它当前持有的对象的大小,并作为特例实现了到
void*
的类型转换,那么类似的事情是可能的。但事实并非如此,所以这是不可能的<代码>标准::任何都不能以这种方式工作。你必须找到其他方法来做你想做的事情。此外,你确实意识到任何
std::any
都可以存储任何对象,而不同的
std::any
s可以存储不同大小的不同对象?因此,在
std::any
s的向量中,它们中的每一个都可能有不同的实际大小,那么您能否解释一下,您希望将某个对象(不管是什么)的
sizeof
乘以向量中的值的数量,从而获得准确的字节数?如果你花点时间思考一下,你应该意识到为什么这种方法从根本上说是有缺陷的,而且是不可撤销的,不可能工作的。这个->
std::any\u cast(你的\u any\u实例在这里)
@Ruks,如果any项不是LPVOID,它就不起作用,我需要一种方法来自动执行,这样我仍然可以使用
args.data()
您需要一种方法来知道
std::any
类型是否持有
LPVOID
对象。该类不共享其当前持有的类型。尝试创建作用域枚举类型或类似的类型
class any
{
private:
    struct base {
        virtual ~base() {}
        virtual base* clone() const = 0;
    };
    template <typename T>
    struct data : base {
        data(T const& value) : value_(value) {}
        base* clone() const { return new data<T>(*this); }
        T value_;
    };
    base* ptr_;
public:
    template <typename T> any(T const& value) : ptr_(new data<T>(value)) {}
    any(any const& other) : ptr_(other.ptr_->clone()) {}
    any& operator= (any const& other) {
        any(other).swap(*this);
        return *this;
    }
    ~any() { delete this->ptr_; }
    void swap(any& other) { std::swap(this->ptr_, other.ptr_); }

    template <typename T>
    T& get() {
        return dynamic_cast<data<T>&>(*this->ptr_).value_;
    }
};

template<typename T>
size_t vectorsizeof(const typename std::vector<T>& vec)
{
    return sizeof(T) * vec.size();
}

std::vector<any> args{100, 1.1f};
WriteProcessMemory(hProc, pMemory, args.data(), vectorsizeof(args), nullptr)