2017-06-24 8 views
7

型がstd :: numeric_limitsに項目を持っているかどうかを確認したいのですか?型が配列の場合(あるいは数値ではない場合)、コンパイラエラーが発生します。これにより、型がstd :: numeric_limitsでサポートされているかどうかに基づいて検出と分岐ができなくなります。私は誰もが共有したいと思うどんな洞察にも感謝します。いくつかの非数値型のstd :: numeric :: type <T>の特殊化の検出T

// the following provokes compiler error on Clang 
// Function cannot return array type 'type' (aka 'char [20]') 
static_assert(
    ! std::numeric_limits<char[20]>::is_specialized, 
    "! std::numeric_limits<char[20]>::is_specialized" 
); 
// invokes static assert on compile as expected 
static_assert(
    std::numeric_limits<char[20]>::is_specialized, 
    "std::numeric_limits<char[20]>::is_specialized" 
); 
+1

「検出して分岐する」方法の例を教えてください。私たちは皆が答えを知っている 'char [20]'のような固定型ではなく、テンプレートの中で何かを推測していますか? – aschepler

+1

"検出と分岐"を定義します。 'static_assert'の目的は、実際にアサーションに失敗した場合にコンパイルエラーを発行することです。別の結果が必要な場合は、それが何であるかを説明する必要があります。 –

答えて

2

あなたはstd::numeric_limitsの内側を見てみましょうか、ドキュメントを見てみる場合は、返す関数がある見ることができるようにあなたはここで、以下の

template<class T> 
class numeric_limits 
{ 
public: 
    static constexpr bool is_specialized = false; 
    static constexpr T min() noexcept; 
    static constexpr T max() noexcept; 
    static constexpr T lowest() noexcept; 

のようなメソッドの宣言が表示されますので、これが起こります値、およびC++によるTは値によって配列型を返すサポートしていません(Why doesn't C++ support functions returning arrays?を参照)

したがって、次の行が

をコンパイルしません。
std::numeric_limits<char[20]>::is_specialized 

の即時の文脈ではない直接(なぜなら前述したように配列型を返す)を製造誤差が存在することになるので、直接SFINAE有するタイプのis_specialized作品はコンパイルしないかどうかをチェックするさらなる試みテンプレート。あなたがstd::numeric_limitsのためにサポートされている概念を検査する必要がありますので、(この場合はstd::is_arithmetic

ただし、すべてのあなたは、この作業はstd::decay_tタイプ

std::numeric_limits<std::decay_t<char[20]>>::is_specialized 

にあることを確認するために、ここで行う必要がありますそして今、それはなります明示的に配列型をポインタに崩壊させ、その関数から返すことができるからです。誤って腐敗していないタイプのためにstd::numeric_limits::is_specializedを呼びたくないので、まずそれをやりたいと思うかもしれません。const int&

関連する問題