c++ - 在 C++14 中替换 if constexpr 的通用解决方案
问题描述
首先,我已经看过Constexpr if alternative,但这并没有帮助。
我更新了帖子以明确阐明通用解决方案的必要性。我需要的是一个通用的解决方案,可以if constexpr
在 C++14 中使用 C++17 的潜力。lambdas
也许,我们可以用和/或在这里做点什么boost::hana
?
下面你会发现一个使用的小例子if constexpr
——我不需要只针对下面提到的案例的解决方案——而是一个通用的解决方案,它可以在大多数情况下作为替代品(if constexpr
如果不是无处不在)。您可以假设我正在将 C++17 代码移植if constexpr
到 C++14——最简单的方法是什么?
我正在考虑解决方案,可能如下所示,但不确定如何实现:
if<condition>(func1).elif<condition2>(func2).else(func3)
其他想法也非常受欢迎。
要测试的 C++17 代码:
#include <string>
template<class T>
constexpr bool value = true;
template<>
constexpr bool value<std::string> = false;
template<class T>
void method(const T& arg) {
if constexpr (value<T>) {
if (!arg) return;
}
//mylogic(arg);
}
int main() {
std::string arg;
method(arg);
int arg2;
method(arg2);
return 0;
}
解决方案
std::enable_if
您可以通过将类型相关的代码移动到具有专业化的单独函数中来以老式方式进行:
#include <string>
template<class T>
constexpr bool value = true;
template<>
constexpr bool value<std::string> = false;
template<class T, std::enable_if_t<value<T>, bool> = true>
bool is_unset(const T& arg)
{
return !arg;
}
template<class T, std::enable_if_t<!value<T>, bool> = true>
bool is_unset(const T& arg)
{
return false;
}
template<class T>
void method(const T& arg) {
if (is_unset<T>(arg)) {
return;
}
//mylogic(arg);
}
int main() {
std::string arg;
method(arg);
int arg2;
method(arg2);
return 0;
}
推荐阅读
- python - 如何将计数器列表中的数据显示为图表?
- python-2.7 - 如何在 anaconda 中安装 Tensorflow GPU 1.7.0?
- lua - 尝试索引一个零值(全局“随机”)lua问题
- python - 使用列表的最后一个元素直到循环完成
- postgresql - Odoo &NGINX:轮询进程无法通过 NGINX 反向代理连接到数据库
- javascript - 从所有邮件中收集所有电子邮件线程的问题;程序只收集前 500 个
- c - STM32F中C中的圆形浮点数
- python - “utf-8”编解码器无法解码位置 54 中的字节 0xff:无效的起始字节
- php - 具有 Polylang + 搜索栏功能的革命滑块
- database - spark.catalog.tableExists("newDb.newTable") 方法抛出 NoSuchDatabaseException 而不是返回 false(“newDb”不存在)