2015-05-07 19 views
1

我有類似於integral_constant的類,它需要參數編譯時間布爾值constexpr。現在我想創建is_signed這個特性,那應該檢查一下is_integral<T>的評估結果是否爲true,如果是的話,我會檢查是否爲T(-1) < T(0)模板參數列表短路?

會爲任何給定類型或這種特質的工作將它未能就不能用-1和0值來構造類型?換句話說,模板參數列表中的constexpr布爾表達式是否短路?

+0

你冷總是怎麼看[++的libstdc(https://gcc.gnu.org/libstdc++/)實現['is_signed'(http://en.cppreference.com/w/cpp/types/is_signed)來自[''](http://en.cppreference.com/w/cpp/header/type_traits) – NathanOliver

回答

1

它不「短路」,因爲表達式仍然必須是有效的,即使它實際上沒有評估,所以你需要添加一個間接層。

一個可能的解決方案:

namespace details { 
    // primary template for integrals 
    template<class T, bool = is_integral<T>::value> 
    struct is_signed_integral_impl : std::integral_constant<bool, T(-1) < T(0)> {}; 

    // not integral 
    template<class T> 
    struct is_signed_integral_impl<T, false> : std::false_type {}; 
} 

template<class T> 
struct is_signed_integral : details::is_signed_integral_impl<T> {}; 
1

這種延遲的評價是mpl::eval_if的原因:

template <typename T> 
struct check_minus_1 
    : std::integral_constant<bool, T(-1) < T(0)> 
{ }; 


template <typename T> 
struct is_signed 
    : mpl::eval_if_c<is_integral<T>::value, 
        check_minus_1<T>, 
        std::false_type>::type 
{ }; 

check_minus_1只適用於整數類型,但如果is_integral<T>::value計算結果爲只會被實例化true