【发布时间】:2021-09-21 22:49:10
【问题描述】:
我正在使用为不同类型定义一些函数的 C API。比如:
// defined in a header:
extern "C" A* A_create();
extern "C" B* B_create();
是否可以从模板化的 C++ 函数调用这些函数,以便模板类型参数确定要调用的 C 函数?
类似:
// Template specialization for when T_create() exists
template <typename T>
auto create() -> declval( T##_create() ) {
// This is not valid syntax, but I'd like to call A_create() if this
// template is instantiated with A, B_create() if this is
// instantiated with B, etc. If the function doesn't exist, I'd like
// the compiler to fall back to the generic implementation below.
return T##_create()
}
// Template specialization for when T_create() doesn't exist
template <typename T>
T* create() {
return new T; // generic version just calls new.
}
只是想知道是否可以在不对来自 C api 的每种类型的 create() 函数进行显式特化的情况下做到这一点。
【问题讨论】:
-
不是模板,但也许你可以有一个从 typeid 到函数的
std::map。 -
只有
#define宏可以从较小的部分创建标识符。 -
您不能只混合使用
delete和free,因此您需要跟踪是否使用了通用的new版本,或者它是否真的是@987654329 的C 函数之一@ed 它让你知道以后如何释放内存。 -
@TedLyngmo 指出的问题可以通过使用 C 语言包装器专业化
return std::unique_ptr<A, void(*)(A*)>(A_create(), &A_destroy);或类似的以及默认模板只是return std::make_unique<T>();来解决。当然,使用它们的代码可能需要在一些地方添加一些.get()语法。
标签: c++ templates c++14 sfinae