我有一些自动生成的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/