我有一些自动生成的C++代码来包装一些C代码。

C代码具有可预测的结构,但具有/不具有某些功能。

由于C++代码是从没有此信息的描述中得出的。我想使用模板处理器来决定是否可以调用此函数。

小例子:

struct SomeStruct{
  int indicatorMember;
};
extern "C" void someFun(struct SomeStruct* somePointer){
}



void someCPPcode(){
  SomeStruct s;
  // do something

  someMechanismToCall_someFunIfExists(&s);

  // do something other
}
someMechanismToCall_someFunIfExists的外观如何,以便在存在someFun和不存在indicatorMember的情况下可以编译/运行someCPPcode?

这有可能吗?

如果某个成员是结构的一部分,也可以决定此功能是否存在。
因此,如果ojit_code存在,则该函数也存在。

最佳答案

您可以使用优先级较低的重载来解决问题:

// "C-Header"
struct SomeStruct
{
  int indicatorMember;
};

// Present or not
extern "C" void someFun(struct SomeStruct* somePointer){

}

// Fallback
void someFun(...) { /*Empty*/ }

void someCPPcode()
{
  SomeStruct s;
  // do something

  someFun(&s);

  // do something other
}



有几种检测成员存在的方法,例如 std::experimental::is_detected 的使用。

但是在模板之外,您仍然有问题:
decltype(auto) someFunIfExists([[maybe_unused]] SomeStruct* p)
{
    if constexpr (has_someFunc<SomeStruct>::value) {
        return someFun(p); // Not discarded as you might expect -> Error
    }
}

因为if constexpr (false) { static_assert(false); }无效)。

因此,您必须将函数包装在模板中:
template <typename T>
decltype(auto) someFunIfExists([[maybe_unused]] T* p)
{
    if constexpr (has_someFunc<T>::value) {
        return someFun(p);
    }
}

void someCPPcode(){
  SomeStruct s;
  // do something

  someFunIfExists(&s);

  // do something other
}

关于c++ - c++调用c函数(如果存在),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59176159/

10-13 06:50
查看更多