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

gui*_*ism 5 c++ c++11 c++14

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

if (foo != bar && foo != baz)
Run Code Online (Sandbox Code Playgroud)

在Python中我会这样做:

if foo not in {bar, baz}:
Run Code Online (Sandbox Code Playgroud)

C++ 11或C++ 14中是否有一个奇特的功能允许我做类似的可读操作?

编辑:很多人都在想我为什么要替换这么短的东西.我不是,但我不想让我的例子像原始代码一样丑陋和难以理解.它更像是:

if (somelongvariablename.somelongmethodname() !=
    SomeReallyLongNamespace::AndAnotherSubClassname::A_LONG_CONSTANT_NAME &&
    somelongvariablename.somelongmethodname() !=
    SomeReallyLongNamespace::AndAnotherSubClassname::ANOTHER_LONG_CONSTANT_NAME) {
    // foo
Run Code Online (Sandbox Code Playgroud)

Ker*_* SB 10

这样的事情怎么样:

#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...>());
}
Run Code Online (Sandbox Code Playgroud)

用法:

if (x != AnyOf(1, 3, 5)) { f(); }
Run Code Online (Sandbox Code Playgroud)

  • 如果你将`In`重命名为'AnyOf`然后读取它会更好地流动"x不等于1,3,5中的任何一个" (5认同)
  • 请注意,此代码不是C++ 14(折叠表达式). (4认同)

bip*_*pll -1

这是我的 15 英寸 16:9 笔记本电脑上的一行:D

#include <iostream>
#include <set>

int main() {
    for(std::set<int> omg({1, 2, 3, 4}); omg.find(42) == omg.cend(); ) { std::cout << "There's no Answer." << std::endl; break; }
}
Run Code Online (Sandbox Code Playgroud)