问题描述
有没有办法定义类型并执行以下操作?
char c = 'a';
if (c == BRASSECHARTYPE)
{
// do something if c is one of the following char [{()}]
}
解决方法
有很多方法可以做到:
简单的功能:
bool isOneOfChars(char ch,std::initializer_list<char> chars)
{
return std::find(std::begin(chars),std::end(chars),ch) != std::end(chars);
}
bool isBrace(char ch)
{
return isOneOfChars(ch,{'[','{','(',')','}'});
}
带有折叠表达式的花式模板:
template<char...Chars>
constexpr bool isOneOfChars(char ch)
{
return ((Chars == ch) || ...);
}
constexpr bool isBrace(char ch)
{
return isOneOfChars<'[','}'>(ch);
}
或指定初始化的查找表(clangs 支持):
constexpr bool isBrace(char ch)
{
constexpr bool braceTable[256] {
['['] = true,['{'] = true,['('] = true,[')'] = true,['}'] = true,};
return braceTable[static_cast<unsigned char>(ch)];
}
或任何其他解决方案。
https://godbolt.org/z/beGzq4snM
,您可以使用 std::string::find
来检查字符是否等于 [{()}]
中的任何一个:
#include <string>
#include <iostream>
int main(){
char needle = 'c';
std::string haystack = "[](){}";
if (haystack.find(needle) != std::string::npos) {
std::cout << needle << " was found in " << haystack << "\n";
}
}