我正在为 C++ 库编写一个简单的包装器。我有以下类型描述成功结果或错误:
template<typename T>
struct Result
{
T value;
const char* error;
static Result<T> FromFunction(std::function<T()> function)
{
Result<T> result = {};
try
{
result.value = function();
}
catch( cv::Exception& e )
{
const char* err_msg = e.what();
auto len = std::strlen(err_msg);
auto retained_err = new char[len + 1];
std::strcpy(retained_err, err_msg);
result.error = retained_err;
}
return result;
}
};
我使用它:
extern "C" {
Result<double> foo() {
...
return result;
}
}
它在 GCC 中工作得很好(这个函数被调用并返回正确的结果),但是,msvc 会因为模板参数作为函数返回类型而感到非常沮丧:
error C2526: 'foo': C linkage function cannot return C++ class 'CResult<double>'
我编写了以下解决方法,它似乎有效,但我不确定公共(public)接口(interface)中的 void*
:
void* foo() { {
return &result;
}
这被认为是一种不好的做法吗?因为我想遵循 DRY 原则,不要写太多或包装器,例如 ResultDouble、ResultInt 等。
最佳答案
不确定MSVC有什么问题,但如果使用输出参数似乎很高兴(至少在MSVC19-RTW上,godbolt上可用的版本)
extern "C"
{
void foo( Result<double> * res ) {
//....
*res = {};
}
}
关于c++ - 使用 void 指针作为 FFI 接口(interface)类型的好处,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48448783/