繁体   English   中英

未知类型的C ++算术:无效指针?

[英]c++ arithmetic with unknown types:void pointers?

(我想处理“ void”,我避免使用“ template class”,因为这太麻烦了)

好,建立一些基础

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM