: (Live Demo)
template<int N>
constexpr bool has_forbidden_char(const char (&str) [N], char forbidden)
{
for(int i = 0; i < N; ++i)
{
if (str[i] == forbidden)
return true;
}
return false;
}
int main()
{
static_assert(!has_forbidden_char("foobar", 'x'));
static_assert(has_forbidden_char("foobar", 'f'));
}
편집 : N-1
에으로 반복 당신은 문자열 리터럴 및 임의없는 문자 배열을 받게됩니다 가정하면 . 이런 식으로 매번 널 문자 '\ 0'을 검사하지 않을 것입니다.
//...
for(int i = 0; i < N-1; ++i){ //...
Edit2가을 (길이 제로의 배열은 C++에서 -1에서 색인에 대해 너무 걱정을 존재하지 않는) : 당신이 편안 constexpr
이없는 비주얼 스튜디오 2015를 사용하고 있기 때문에 기능은 다음과 같습니다 :
namespace detail {
template<int N>
constexpr bool has_forbidden_char_help(const char(&str)[N], char forbidden, int index)
{
return (index < N && (str[index] == forbidden || has_forbidden_char_help(str, forbidden, index+1)));
}
} // namespace detail
template<int N>
constexpr bool has_forbidden_char(const char (&str) [N], char forbidden)
{
return detail::has_forbidden_char_help(str, forbidden, 0);
}
int main()
{
static_assert(!has_forbidden_char("foobar", 'x'), "foobar doesn't have x, so this shouldn't fail...");
static_assert(has_forbidden_char("foobar", 'f'), "foobar does have f, so this shouldn't fail...");
}
C- 리터럴 문자열에서 constexpr 함수를 사용할 수 있습니다. Gcc도 확장이 있으므로 리터럴 문자열에 udl을 허용합니다. – Jarod42
Spot on! 나는 그걸 작동시킬 수 있었다. 나는 아래의 @AndyG 대답이 더 읽기 쉽다고 생각하지만 (다른 사람들을 도와주는 답으로 표시 함), 이것은 내가 당신의 제안에 따라 처리 할 수 있었던 것입니다 : –