我在一个网站上看到了这个例子,网站提到: - "它的一个用途(void指针)可能是将通用参数传递给一个函数"
// increaser
#include <iostream>
using namespace std;
void increase (void* data, int psize)
{
if ( psize == sizeof(char) )
{ char* pchar; pchar=(char*)data; ++(*pchar); }
else if (psize == sizeof(int) )
{ int* pint; pint=(int*)data; ++(*pint); }
}
int main ()
{
char a = 'x';
int b = 1602;
increase (&a,sizeof(a));
increase (&b,sizeof(b));
cout << a << ", " << b << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编写如下代码会不会更简单?
void increaseChar (char* charData)
{
++(*charData);
}
void increaseInt (int* intData)
{
++(*intData);
}
int main ()
{
char a = 'x';
int b = 1602;
increaseChar (&a);
increaseInt (&b);
cout << a << ", " << b << endl;
string str;
cin >> str;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
代码更少,而且非常简单.在第一个代码中,我不得不在这里发送数据类型的大小!
Jam*_*lis 13
最好使函数类型安全且通用.最好通过引用而不是指针来获取参数:
template <typename T>
void increment(T& data) {
++data;
}
Run Code Online (Sandbox Code Playgroud)
void* 应尽可能避免在C++中使用,因为模板和继承提供了类型安全的替代方案.
你的代码绝对是更好的选择。 void*失去了类型安全的任何伪装,你的类型安全重载要好得多。良好的直觉。
为了在 C++ 中支持更多类型,您可以定义一个类或函数模板,而不是使用void*. 引用比指针更可取,但您的代码可以更改为:
template <class T> T increase(T* value)
{
return ++(*value);
}
int main(int argc, char* argv[])
{
int i(0);
increase<int>(&i);
char c(0);
increase<char>(&c);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
感兴趣的话,网站是什么?