コンテンツにスキップ

void ポインタ

型をもたないポインタを使う場合に void ポインタを使用します。 あらゆるポインタは void ポインタにすることができますが、 型が必要な場合に安全でないキャストが必要となります。

型の非公開

void ポインタを使用すると 型を公開せずにオブジェクトを扱うことができます。

#ifndef INTEGER_H_
#define INTEGER_H_

void* integer_create(int v);
int integer_get(const void* instance);
void integer_destroy(void* instance);

#endif  // INTEGER_H_
#include "integer.h"

namespace {

class Integer {
public:
    explicit Integer(int x) : x_(x) {}

    int Get() const {
        return x_;
    }

private:
    int x_;
};

}  // namespace

void* integer_create(int v) {
    return new Integer(v);
}

int integer_get(const void* instance) {
    return reinterpret_cast<const Integer*>(instance)->Get();
}

void integer_destroy(void* instance) {
    delete reinterpret_cast<Integer*>(instance);
}
#include <iostream>

#include "integer.h"

int main() {
    void* obj = integer_create(5);
    std::cout << integer_get(obj) << std::endl;
    integer_destroy(obj);
    obj = nullptr;

    return 0;
}

この例では Integer クラスを公開せずに void ポインタとして扱っています。

static_cast によるキャスト

void ポインタはポインタの一種ですが、 reinterpret_cast ではなく static_cast でもキャストできます。

int integer_get(const void* const instance) {
    return static_cast<const Integer* const>(instance)->Get();
}

void integer_destroy(void* instance) {
    delete static_cast<Integer*>(instance);
}

C における型非依存の処理

C にはテンプレートがないため、 型に依存しない処理を行う場合にも void ポインタが使用されます。

たとえば、任意の型の配列をソートする C の qsort は次のように使用します。

#include <stdlib.h>

int cmp_int(const void *a, const void *b) {
    int a_val = *(const int *)a;
    int b_val = *(const int *)b;

    if (a_val < b_val) {
        return -1;
    }
    if (a_val > b_val) {
        return 1;
    }
    return 0;
}

int main() {
    int x[5] = {1, 5, 2, 4, 3};
    qsort(x, 5, sizeof(int), cmp_int);

    return 0;
}

C++ ではこの用途で void ポインタを使用せずテンプレートを使用してください。