c++ - 在编译时选择全局作用域函数

标签 c++ c++11

我必须使用不提供有关其版本的任何编译时间信息的第三方 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/

相关文章:

java - 为什么一元后置运算符在 C++ 和 Java 中的行为不同?

c++ - CComBSTR::AssignBSTR() 的可能返回值是什么?

c++ - 使用类引用修改另一个类中的公共(public)成员

c++ - 对称矩阵中的线性索引

c++ - 使用纯抽象数据类型作为返回?

c++ - QT5.3 如何将我的 Qobject 添加到 QQmlEngine 并通过 QML 访问它的属性?

linux - 枚举类型声明的 C++11 编译错误如预期的那样在数字常量之前

c++ - std::stringstream 相当于 u32string?

c++ - 模板方法定义问题 - 错误 C2244 : unable to match function definition to an existing declaration

c++ - 有什么理由为返回 void 的函数声明 constexpr?