C++中的void指针

w4j*_*j3d 5 c++

我在一个网站上看到了这个例子,网站提到: - "它的一个用途(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++中使用,因为模板和继承提供了类型安全的替代方案.

  • 模板是要走的路.在编译时强制执行类型安全.我只是更进一步,将数据传递为`T&`.在大多数情况下,您甚至不必编写`increment <int>(i)`,因为编译器通常会自动推断出类型`T`. (2认同)

Ste*_*end 0

你的代码绝对是更好的选择。 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)

感兴趣的话,网站是什么?