带有未知类型的c++算术:void指针
c++ arithmetic with unknown types:void pointers?
(我想处理"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 = ⁣
void *va, *vb;
va = a;
vb = b;
*c = (int)(*static_cast<int*>(va) + *static_cast<int*>(vb));
std::cout << *c; // Outputs "3"
}
相关文章:
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- (C++)分析树以计算返回错误值的简单算术表达式
- 在c++类上调用void函数
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- 在派生函数中指定void*参数
- C++为什么尽管我调用了void函数,它却不起作用
- 如何从void函数输出字符串
- 我应该使用什么来代替void作为变体中的替代类型之一
- 奇怪的结构&GCC&clang(void*返回类型)
- Arduino:for/while/if在void setup()或void loop()之前?——错误:之前需要不合格
- 为什么这个函数将"const char*"转换为"void* const"而不是"const void*"
- 引用一个已擦除类型(void*)的指针
- 为什么std::valarray不是算术的
- 对于C++中使用智能指针的指针算术限制,有没有一种变通方法
- 将尾部调用void(i32,..)位转换为llvm::函数以获取FnAttribute
- 库函数需要一个 std::function<void(void)>,如何传入类函数?
- 算术序列与区间的最大重叠
- C++如何修复旧代码中的 void* 算术
- 带有未知类型的c++算术:void指针
- void*指针上的指针算术