c++ - 在 C++11/14 中说 "foo not in {bar, baz}"的漂亮方式

标签 c++ c++11 c++14

我正在编写 C++,但缺少 Python 的清晰度。但我知道 C++ 一直在发展,我想知道是否有更好的方法来做这样的事情:

if (foo != bar && foo != baz)

在 Python 中我会这样做:

if foo not in {bar, baz}:

C++11 或 C++14 中是否有一个奇特的特性允许我做一些类似可读的事情?

编辑:很多人想知道为什么我要尝试替换这么短的东西。我不是,但我不想让我的示例像原始代码一样丑陋和不可读。它更像是:

if (somelongvariablename.somelongmethodname() !=
    SomeReallyLongNamespace::AndAnotherSubClassname::A_LONG_CONSTANT_NAME &&
    somelongvariablename.somelongmethodname() !=
    SomeReallyLongNamespace::AndAnotherSubClassname::ANOTHER_LONG_CONSTANT_NAME) {
    // foo

最佳答案

这样的事情怎么样:

#include <type_traits>
#include <tuple>
#include <utility>

template <typename ...Args> struct InT: std::tuple<Args...>
{
    template <typename ...Brgs>
    explicit InT(Brgs &&... brgs)
    : std::tuple<Args...>(std::forward<Brgs>(brgs)...) {}

    template <typename T, std::size_t ...I>
    bool noteq(T && t, std::index_sequence<I...>) const
    {
        return (true && ... && (t != std::get<I>(*this)));
    }
};

template <typename ...Args>
InT<Args &&...> AnyOf(Args &&... args)
{
    return InT<Args &&...>(std::forward<Args>(args)...);
}

template <typename T, typename ...Args>
bool operator!=(T && t, InT<Args...> in)
{
    return in.noteq(std::forward<T>(t), std::index_sequence_for<Args...>());
}

用法:

if (x != AnyOf(1, 3, 5)) { f(); }

关于c++ - 在 C++11/14 中说 "foo not in {bar, baz}"的漂亮方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37887064/

相关文章:

c++ - 在编译时使用 C++ 从另一个数组中提取一个数组

c++ - 基于 C++ 中的 bool vector 选择 vector 中的对象

c++ - Arduino 的 3D 阵列

c++ - 以编程方式压缩和修复数据库

c++ - 文件范围的原子是否受初始化顺序失败的影响?

c++ - 语句范围 [ c++11 ]

c++ - Qt框架使用ffmpeg库报错

c++ - C 文件的 Eclipse CDT 索引器结果与 C++ 文件不同

c++ - 存储相同类型的两个相关值的惯用方法

C++ 赋值给隐式转换的左值