5

スカラー型 (integer、float など) に対してのみインスタンス化できるテンプレート化されたクラスがあり、メンバー typedef を常にその型の符号付きバリアントにしたいと考えています。あれは:

unsigned int-> signed int
signed long long-> signed long long(署名済み)
unsigned char-> signed char
float-> float
long double->long double
など...

残念ながら、std::make_signed浮動小数点型ではなく、整数型でのみ機能します。これを行う最も簡単な方法は何ですか? using SignedT = ...;テンプレートパラメータ T がすでにスカラーであることが保証されているテンプレートクラスの一部になるために、フォームの何かを探しています。

4

4 に答える 4

3

を使用する最初の失敗した試みの後、std::conditional代わりに SFINAE を使用することにしました。std::enable_if浮動小数点型の特殊化を条件付きで有効にするために使用しています。

template<typename T, typename Enable = void>
struct my_make_signed {
    typedef typename std::make_signed<T>::type type;
};

template<typename T>
struct my_make_signed<T,
    typename std::enable_if<std::is_floating_point<T>::value>::type> {
    typedef T type;
};
于 2013-05-04T18:50:13.920 に答える
0
namespace mine {        

    template<typename T, bool b>
    struct make_signed__ {
        typedef T type;
    };

    template<typename T>
    struct make_signed__<T,false> {
        typedef typename std::make_signed<T>::type type;
    };

    template<typename T>
    struct make_signed {
        typedef typename make_signed__<T, std::is_floating_point<T>::value>::type type;
    };

}

int main () {
    std::cout << std::is_same<mine::make_signed<unsigned int>::type, int>::value;
    std::cout << std::is_same<mine::make_signed<long double>::type, long double>::value;
}
于 2013-05-04T18:54:23.413 に答える