c++ - 在编译时检查类中的静态函数是否可用
问题描述
我目前正在为一个具有多个实现的应用程序连接一个单一的目的。它在运行时检查是否可以使用适当的实现或是否使用了回退。
为此,我希望所有实现都实现一个静态函数static bool is_available()
。
由于不能在底层基类中将静态函数抽象化,如果该方法未在子类中静态实现,是否有一些预处理器魔法可以让我输出错误消息?
解决方案
您可以在编译时使用模板对此进行测试。它是这样的(抱歉没有测试):
template<class Type_to_test, class Technical_Detail = void>
struct has_isAvilable : std::false_type {}
template<class Type_to_test>
struct has_isAvilable<Type_to_test, std::enable_if_t<
std::is_same<bool,decltype(Type_to_test::is_available())>::value
> > : std::true_type {}
然后您可以在代码中的某处使用:
static_assert(has_isAvilable<Implementation>::value,"Usefull error message");
其中 Implementation 是您要测试的类。看看std::type_traits
这方面的例子。
推荐阅读
- csv - 处理数组并按 csv 中的一个字段对行进行分组
- angular - 部分匹配路由到同一组件
- python - 如何通过python将已知的一维数组转换为二维数组但不使用numpy?(只使用基本的python语言))
- ios - 无法执行为 iOS 配置 MSAL 的步骤 3
- sql - 将“现在”行添加到持续时间计算
- apache-beam - Apache Beam Python 窗口化和 GroupByKey
- windows - 如何编写 powershell 脚本来知道磁盘是基本的还是动态的?
- git - 仅从 git hub 下载特定文件夹
- javascript - Testing routes to give same results on every request chai/mocha
- c++ - 调整 Scatter Gather List 缓冲区地址和长度