時々、文字列の長さを定数と比較する必要があります。たとえば
:コンパイル時の "strlen()"は有効ですか?
if (line.length() > 2)
{
// Do something...
}
しかし、私はコード内の「魔法」の定数を使用しないようにしようとしています。
通常、私は、このようなコードを使用します。
if (line.length() > strlen("[]"))
{
// Do something...
}
それが原因で関数呼び出しを効率的に読みやすく、しかしではありません。
私は次のようにテンプレート関数を書いた:
template<size_t N>
size_t _lenof(const char (&)[N])
{
return N - 1;
}
template<size_t N>
size_t _lenof(const wchar_t (&)[N])
{
return N - 1;
}
// Using:
if (line.length() > _lenof("[]"))
{
// Do something...
}
リリースビルド(VisualStudioを2008年)で、それはかなり良いコードを生成します。
cmp dword ptr [esp+27Ch],2
jbe 011D7FA5
をさらに良いことには、コンパイラが含まれていないということです"[]"バイナリ出力の文字列。
コンパイラ固有の最適化ですか、それとも一般的な動作ですか?
おそらく、すべての配列型に対して1つのテンプレートを使用することができます。これは、次のようなものです: 'template size_t _lenof(const T(&)[N]){return N - 1; } 'は、あなたの例と同じように動作するはずです。 –
@ Envan Teran:良いアイデアですが、これらの関数は '\ 0'を終了するため文字列(char/wchar_tの配列)に対してのみ意味があります。あなたの関数はint [10]で動作し、9を返します - それは意味をなさないと思います;) – Dmitriy
@Dmitriy:確かに –