2017-06-09 8 views
1

私は本当にこの上の専門用語を知らない、私はちょうど例をやる:私は静的constクラスメンバの値をテンプレート型で変更することはできますか?

value_holder<float> floaty; 
std::cout << floaty.is_integer << "\n"; 

を行う際

template <typename T> 
struct value_holder { 
    T value; 
    static const bool is_integer = ??; // if T is int or long set this to true, else set false 
} 

ので、それを印刷することを0

どうだろう私はメンバーis_integerを定義する必要がありますか?

答えて

2

これを行うにはstd::is_sameを使用できます。
最小限の作業例を次に示します。

#include<type_traits> 

template <typename T> 
struct value_holder { 
    T value; 
    static const bool is_integer = std::is_same<int, T>::value or std::is_same<long, T>::value; 
}; 

int main() { 
    static_assert(value_holder<int>::is_integer, "!"); 
    static_assert(not value_holder<char>::is_integer, "!"); 
} 

別の可能なアプローチは、テンプレートの特殊化に基づいています。

template <typename T> 
struct value_holder { 
    T value; 
    static const bool is_integer = false; 
}; 

template <> 
struct value_holder<int> { 
    int value; 
    static const bool is_integer = true; 
}; 

template <> 
struct value_holder<long> { 
    long value; 
    static const bool is_integer = true; 
}; 

はとにかくそれはもう少し詳細な私の視点からだと、あなたのクラスが結合データ・メンバーよりも多く含まれている場合にいらいらすることができます。この道に沿って何か作業をする必要があります。

0

タイプの形質をお探しの場合は、 std::is_integralがあなたにとって興味深いかもしれません。

+0

私をあなたが本当にしたい場合はis_integerその後、カスタム型特性を定義することができる唯一のintまたはlongのために真でありますOPがテンプレート特化を実行する方法を尋ねていると思う。 – Dai

+0

@Daiここでテンプレートの特殊化を使用することができますが、私は型の形質が最も適していると確信しています。 – Quentin

+0

私の例は悪いかもしれませんが、私はそれを短くしようとしていました。実際には一体型であるかどうかをチェックするのではなく、テンプレートタイプに基づいて静的constメンバーを定義するだけです。 – user81993

2

クエンティンの答えによれば、あなたはタイプ形質を使います。 std::is_integralはあなたの例では意味をなさないでしょう:

template <typename T> 
struct value_holder { 
    T value; 
    static constexpr bool is_integer = std::is_integral<T>::value; 
}; 

これはあなたのコメントと正確には一致しません。もちろん

template <typename T> 
struct is_int_or_long : std::false_type {}; 

template <> 
struct is_int_or_long<int> : std::true_type {}; 

template <> 
struct is_int_or_long<long> : std::true_type {}; 

template <typename T> 
struct value_holder { 
    T value; 
    static constexpr bool is_integer = is_int_or_long<T>::value; 
}; 

std::is_sameトレイト使用することによって短縮することができます:

template <typename T> 
struct value_holder { 
    T value; 
    static constexpr bool is_integer = std::is_same<T, int>::value || std::is_same<T, long>::value; 
}; 
関連する問題