【发布时间】:2018-01-15 21:55:40
【问题描述】:
我必须使用不提供任何关于其版本的编译时间信息的第三方 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();
我尝试使用标签调度和模板专业化来选择合适的函数。例如:
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) 在使用 SDK 的 v2 进行编译时仍然会报告错误func1 has not been declared。为什么它甚至尝试编译不存在的变体?有没有办法允许从 global 范围内选择所描述的功能?
【问题讨论】:
-
使用
#ifdef可能会更好地解决这个问题,并且you 使用-D命令行开关提供正确的版本。这就是宏的用途。 -
如果 GCC 指向
ExecCode<true>模板特化,它应该有一个required from here:行告诉你它为什么认为它需要它。你能发布完整的错误信息吗?