首页 > 解决方案 > 在 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;
}

标签: c++boostc++14template-meta-programmingboost-hana

解决方案


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;
}

推荐阅读