【发布时间】:2012-08-02 08:29:56
【问题描述】:
这个问题是关于 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 到库字符串的转换。 此外,应该使用右删除器(从右堆)。
您如何看待这种方法?
是否存在一些重大缺陷?
有没有更好的选择?
【问题讨论】:
-
你的代码违反了三法则,没有明显的目的。请举个例子。
-
“违反三原则”——是的,我知道,这只是为了演示。
-
“没有明显的目的”,重读我的问题,看看在哪里定义了转换。提示:不同的 std::string 实现
-
“违反三法则”顺便说一句,一些智能指针(我已经说过它是必需的) - 将解决这个问题。
-
所以,我将您的计划总结如下:您主要担心标准库的兼容性以及编译器之间语言的非基本功能的兼容性。您不必担心以互操作方式表示 StringConverter 所需的语言的简单部分。因此,您将库的转换部分编译到其中,并且用户代码的部分通过导出的标头提供,并且用户的编译器将其编译到他们的应用程序中。交换接口是函数/方法调用方案和StringConverter的表示
标签: c++ api stl interop portability