我必须使用不提供有关其版本的任何编译时间信息的第三方 SDK。
假设 SDK v1 定义了以下函数:
bool func1(int);
bool func2(float) {return false; /* not implemented */}
虽然 SDK v2 弃用并删除了 func1()
并正确实现了 func2()
。我需要使我的代码能够正确编译和使用两个版本的 SDK。如果是v1,则选择func1
(),如果不是,则使用func2()
。
我已经成功地实现了编译时查询全局范围 func1()
是否存在:
constexpr bool hasFunc1();
我尝试使用标签分派(dispatch)和模板特化来选择合适的函数。例如:
template <bool THasFunc1>
struct ExecCode;
template<>
struct ExecCode<true>
{
bool getValue() {
return func1(123);
}
}
template<>
struct ExecCode<false>
{
bool getValue() {
return func2(123.567);
}
}
bool getValue() {
return ExecCode<hasFunc1()>::getValue();
}
但是编译器(GCC)在使用v2 SDK编译时仍然报错func1 has not been declared
。为什么它甚至尝试编译不存在的变体?有没有办法允许从全局范围内选择所描述的功能?
最佳答案
您遇到了一个问题,您使用不依赖于模板参数的参数调用未声明的函数。如果 GCC 仍支持宽容模式,则已弃用。本质上,编译器试图将 getValue()
的第一个实现添加到带有参数 “false”
的模板中。可能的解决方法是在 getValue()
或 #ifdef
中使用单一模板规范和 if constexpr
。
关于c++ - 在编译时选择全局作用域函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48257767/