この質問は、C++ <-> C++ の相互運用性に関するものです。
よく知られているように、標準ライブラリのクラス/関数の実装は、ベンダーによって異なる場合があります。さらに、異なるコンパイラ キー、構成 (デバッグ/リリース) などを使用する場合、同じライブラリ ベンダー内でも実装が異なる場合があります。
そのため、多くのライブラリ開発者は古いプレーンな C スタイルの API に移行しています。これは、醜いエラーを起こしやすいインターフェイスにつながります。
たとえば、関数から文字列を取得するために、Win GetCurrentDirectory 関数のようなインターフェイスが使用されます。
DWORD WINAPI GetCurrentDirectory(
__in DWORD nBufferLength,
__out LPTSTR lpBuffer
);
単純な文字列を取得するためだけに、3 つのパラメーター + 両側のいくつかのボイラープレート コード (バッファー サイズが十分かどうかのチェックなど)。
すべての変換を自動的に行い、簡単に再利用できる補助アダプター/プロキシ クラスを使用することを考えています。
何かのようなもの:
#include <string>
#include <algorithm>
#include <iostream>
#include <ostream>
class StringConverter
{
char *str; // TODO: use smart pointer with right deleter
public:
StringConverter(const std::string &user_string) // Will be defined only at user side
{
str=new char[user_string.length()+1];
(*(std::copy(user_string.begin(),user_string.end(),str)))=0;
}
operator std::string() // Will be defined only at library side
{
return std::string(str);
}
~StringConverter()
{
delete [] str;
}
};
StringConverter foo()
{
return std::string("asd");
}
int main(int argc,char *argv[])
{
std::cout << std::string(foo()) << std::endl;
return 0;
}
なお、ユーザー文字列からStringConverterへの変換はユーザー側でのみ定義し、StringConverterからライブラリ文字列への変換はライブラリ内のみで定義する予定です。また、(右側のヒープから) 右側のデリータを使用する必要があります。
このようなアプローチについてどう思いますか?
大きな落とし穴はありますか?
優れた代替手段はありますか?