是否有任何功能可以帮助我更轻松地完成以下操作?
char ch = '+';
if (( ch == '+') || (ch == '-') || (ch == '*'))
{
//do something
}
由于必须在我的代码中多次检查,我更愿意是否有任何类似于
char arr ={'+','-','*'};
if (ch in arr)
{
//do something
}
答案 0 :(得分:4)
在这种情况下,您可以使用:
if ( std::strchr("+-*", ch) )
strchr
函数,来自#include <cstring>
,如果在字符串中找不到该字符,则返回空指针。
答案 1 :(得分:3)
您可以编写一个生成相当于
的代码的函数if (( ch == '+') || (ch == '-') || (ch == '*'))
使用更好的用户语法。
template <typename X>
bool any(const X&) noexcept
{
return false;
}
template <typename X, typename T, typename... Ts>
bool any(const X& x, const T& curr, const Ts&... rest) noexcept
{
return x == curr || any(x, rest...);
}
用法:
if(any(ch, '+', '-', '*')) { /* do something */ }
如图by this godbolt.org comparison所示,这是零成本抽象的示例。
在C ++ 17中,您可以使用fold expression:
template <typename X, typename... Ts>
bool any(const X& x, const Ts&... rest)
{
return ((x == rest) || ...);
}
如果您想多次重复使用相同的比较值而不重复自己,可以创建一个&#34; curried&#34; any
的版本,它首先绑定要检查的参数,然后在后续调用中进行比较。
template <typename... Ts>
auto bound_any(const Ts&... xs)
{
return [xs...](const auto& x)
{
return ((x == xs) || ...);
};
}
用法:
auto is_op = bound_any('+', '-', '*');
if(is_op(ch)) { /* do something */ }
答案 2 :(得分:1)
试试这个
#include <algorithm>
int main() {
char arr[] ={'+','-','*'};
char ch = '-';
if(std::find(arr, arr+sizeof(arr)/sizeof(char), ch) - arr < sizeof(arr)/sizeof(char)){
//do anything
}
return 0;
}
答案 3 :(得分:0)
如果您的数组也是any
,这会使==
成为编译时构造。如果范围是任意的,我无法想到一种方法可以使其更加优化。
我已选择重载#include<iterator>
template<typename Iter>
class any
{
public:
using value_type = typename std::iterator_traits<Iter>::value_type;
constexpr any(Iter begin, Iter end) : begin{begin}, end{end} {}
template<typename T, size_t N>
constexpr any(T (&arr)[N]) : any{arr, arr + N} {}
constexpr bool operator==(const value_type& v)
{
return compare(v, begin);
}
private:
Iter begin, end;
constexpr bool compare(const value_type& v, Iter it)
{
return it != end && (v == *it || compare(v, it + 1));
}
};
template<typename T, size_t N>
any(T (&)[N]) -> any<T*>;
template<typename T, typename Iter>
constexpr bool operator==(const T& t, any<Iter> a)
{
return a == t;
}
,因为它看起来比并排传递参数更好。
static_assert('+' == any("+-*"), "Failure!");
constexpr char ops[] = {'+', '-', '*'};
char c = '/';
if(c == any(ops))
do_stuff(c);
这会产生漂亮的格式
using value_type = typename std::iterator_traits<Iter>::value_type;
Iter
是将value_type
类型的引用别名为template<typename T, size_t N>
any(T (&)[N]) -> any<T*>;
。
any
是return it != end && (v == *it || compare(v, it + 1));
的{{3}},没有明确的模板参数。
any("+-*")
是递归检查范围是否已用尽,如果没有,检查该值是否等于当前元素。
请注意,'\0'
中包含 4 个字符,最后一个字符为$reflectionClass = new ReflectionClass($class_name);
if ($reflectionClass->getMethod($method_name)->class == $class_name) {
// do something
}
。
答案 4 :(得分:0)
对我来说,乍一看,这是一个集合查找:是这个元素中的任何一个等同于这组元素是否包含这个元素。并且,如此:
if ((std::set<char> {'a','b','c'}).count(x) > 0) {
// ...
}
答案 5 :(得分:0)
对于这种特定情况,您可以将布尔表达式包装在您自己的自定义函数中:
bool isOperator(char ch) {
return ( ch == '+') || (ch == '-') || (ch == '*');
}
这将减少其余代码的冗余,因为现在你可以做到
if(isOperator(ch))