这个问题是关于 C++ <-> C++ 互操作性的。
众所周知,标准库类/函数的实现可能因不同的供应商而异。此外,当使用不同的编译器键、配置(调试/发布)等时,即使在同一个库供应商中,实现也可能不同。
由于这个原因,许多库开发人员转向旧的纯 C 风格 API。这导致了丑陋的容易出错的界面。
例如,为了从某个函数中获取字符串,使用了 Win GetCurrentDirectory 函数等接口:
DWORD WINAPI GetCurrentDirectory(
__in DWORD nBufferLength,
__out LPTSTR lpBuffer
);
三个参数+两边的一些样板代码(检查缓冲区大小是否足够等)只是为了得到简单的字符串。
我正在考虑使用一些辅助适配器/代理类,它将自动进行所有转换,并且可以简单地重用。
就像是:
#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 到库字符串的转换。此外,应该使用右删除器(从右堆)。
您如何看待这种做法?
是否存在一些重大缺陷?
有没有一些更好的选择?