2017-09-19 10 views
0

コンパイル時に定数文字列に特定の文字が含まれていないことを検証する方法が必要です。私はstatic_assertの使用について考えましたが、定数ではない.findメソッドを使用しようとしていたので、レンガの壁に当たっていました。コンパイル時または少なくとも使用する前に文字列に禁止文字が含まれているかどうかを確認する創造的な方法はありますか?

私はクラスのコンストラクタでチェックを行うオプションを持っています(インスタンスは上記のクラスのメンバーstatic constです)。
しかし、(コンストラクタの振る舞いを変更すると他の意味があるので)箇条書きを噛む前に、他の誰かがこのような独創的で独創的なアイデアを持っているかどうかを見たいと思います。 。 文字列定数ことで

+1

C-リテラル文字列からconstexpr関数を使用できます。 Gccにも拡張がありますので、リテラル文字列でudlを許可します。 – Jarod42

+0

Spot on!私はそれを働かせることができた。私は以下の@AndyGの回答はもっと読みやすく(他の人を助ける答えとしてマークしています)、これが私の助けを借りてできたものです: –

答えて

4

std::stringは定数式で使用することができないため、おそらくあなたは、リテラル文字列を意味します。 (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にあなたが唯一の文字列リテラルではなく、任意の文字配列を受け取りますと仮定した場合、我々はconstexprを利用することができ、文字列リテラルの場合

。このようにして、毎回NULL文字 '\ 0'をチェックすることはありません。 (長さゼロの配列は、C++での-1インデックスそんなに心配は存在しません)

//... 
for(int i = 0; i < N-1; ++i){ //... 

EDIT2:あなたはリラックスしたconstexprを持っていないのVisual Studio 2015を使用しているので、ここでは動作するC++ 11準拠のソリューションを紹介します。

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..."); 
} 
+0

詳細な例@AndyGありがとうございます。残念ながら、私のコンパイラ(VS2015)は、使用したコンストラクタの多くが好きではなく、コンパイラの切り替えはオプションではありませんでした。 –

+0

@SeeSharper:分かります。私はVS2015に準拠したバージョンを作っていきます。 – AndyG

+0

@SeeSharper:編集済みの回答を参照してください:-) – AndyG

関連する問題