我正在编写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)
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)