たとえば、Acme 社が非常に醜い C API を備えた便利なライブラリをリリースしたとします。構造体と関連する関数を C++ クラスでラップしたいと考えています。元のライブラリが名前空間内にないため、ラッパー クラスに同じ名前を使用できないようです。
このようなことは不可能ですよね?
namespace AcmesUglyStuff {
#include <acme_stuff.h> // declares a struct Thing
}
class Thing {
public:
...
private:
AcmesUglyStuff::Thing thing;
};
リンクが問題になります。
ライブラリをラップし、名前空間を C ライブラリ名で汚染しないように考える唯一の方法は、このようなハックで、クラスにスペースを確保することです。
// In mything.h
namespace wrapper {
class Thing {
public:
...
private:
char impl[SIZE_OF_THING_IN_C_LIB];
};
}
// In thing.cc
#include <acme_stuff.h>
wrapper::Thing::Thing() {
c_lib_function((::Thing*)impl); // Thing here referring to the one in the C lib
}
それが唯一の方法ですか?などのように、すべてのクラス名にプレフィックスを付けることは避けたいと思いますXYThing
。