带有未知类型的c++算术:void指针

c++ arithmetic with unknown types:void pointers?

本文关键字:算术 void 指针 c++ 未知 类型      更新时间:2023-10-16

(我想处理"void",我避免"template class",因为它太麻烦了)

ok establish some ground

int aa=3;
int bb=4;
int cc=0;
int *a, *b, *c;
a = &aa;
b = &bb;
c = &cc;
*c = *a +*b; //yields 7

但是我想做以下事情:

void *va;
void *vb;
void *vc;
va = a;
vb = b;
*c = (int)(*va + *vb);  // <-- 3 errors see below

但是我得到错误:

 error C2100: illegal indirection
 error C2100: illegal indirection
 error C2110: cannot add two pointers

不能对void指针解引用

如果你想把它们转换成int*,你应该在解引用之前这样做;

(*(int*)vc) = (*(int*)va) + (*(int*)vb);

但你最好更具体,你到底想做什么,你称之为"以下"

在C或c++中,你根本不能对真正未知的类型做很多操作。

您可以使用Boost Variant在一个变量中支持多种算术类型,或者您可以使用union并基本上通过自己区分Boost Variant所做的事情。或者,您可以构建类型层次结构,并使用虚拟方法来执行所需的操作。但是,您不能对类型已完全删除的值执行算术运算。

void指针是一个特殊的指针,它专门表示一个类型的缺失。它们通常用于为调用者提供存储空间,调用者知道类型,并且可以来回转换。

void*进行解引用是没有意义的,实际上是无效的语法,对指针进行解引用的全部目的是获取所指向的项,如果你没有指定你所指向的是什么,你就无法获得它。

要"修复"你的代码,你需要在解引用之前强制转换:http://www.ideone.com/eKxxn

#include <iostream>
int main() {
        int ia = 1, ib = 2, ic = -1;
        int *a = &ia, *b = &ib, *c = &ic;
        void *va, *vb;
        va = a;
        vb = b;
        *c = (int)(*static_cast<int*>(va) + *static_cast<int*>(vb));
        std::cout << *c; // Outputs "3"
}