static_assert
の有用性を理解しようとしています。デザインを強制する際に役立つかどうか、もしあれば、どうすればよいかを知りたいと思います。static_assertを使用してテンプレートタイプを適用する
テンプレートタイプのサイズに基づいて部分的に特殊化された別のテンプレートクラス内に独自の実装を隠す一般的なテンプレートクラスがあります。
template <class T, size_t S = sizeof(T)>
struct Helper;
template <class T>
struct Helper<T, sizeof(long)>
{
static T bar();
};
// ... other specializations ...
template <class T>
class Foo
{
public:
T bar()
{
return Helper<T>::bar();
}
};
T
のサイズはヘルパーの専門によってサポートされている場合はFooのみサポートされています。ここでは、このデザインの簡単な概要です。たとえば、Foo<long>
とFoo<unsigned long>
の両方がサポートされています。ただし、ユーザーがFoo<bool>
を作成しようとしたとします。通常、これはエラーの原因となります。ヘルパーbool
の特殊化は定義されていません。これは意図した動作です。
このデザインでstatic_assert
を使用して、このインターフェイスのユーザーにとってより有用なエラーを提供する方法はありますか?
さらに、サイズが正しいかもしれないのに、ユーザーが特定の種類の使用を制限したいと考えています。たとえば、Foo<float>
は許可しないでください。今、私がこれを強制することを知っている唯一の方法は、ドキュメンテーションの大胆なコメントです。 :)
より一般的に考えると、それはサポートされている整数型ですか? 'char'、' bool'、 'float'などはありませんか? – Rapptz
テンプレートタイプの制約または「概念」をSOで検索します。これを行うための機能は、最終段階でC++ 11から削除されました。同様の結果を達成する自動化された方法はそれほどありません。 – luke
@Rapptz、 'char'、' int'、 'long'は、' unsigned'バージョンと一緒にサポートされるべきです。 'sizeof(int)== sizeof(long)== sizeof(unsigned long)'の場合、 'int'、' long'、 'unsigned long'のコードは同じです。 – Zeenobit