10

さまざまな種類の数(整数、浮動小数点)のバリデーターを作成したい例:

typename number_validator<T>::type validator;

stdieis_integralと.で便利な特性を見つけましたis_floating_point。これらの特性を使用してテンプレートを特殊化するにはどうすればよいですかnumber_validator(それはstruct) ですか?

編集:私はこのようなものを探しています:

template<typename T, typename Enabled>
struct number_validator {};

template<typename T>
struct number_validator<T, typename enable_if<is_floating_point<T>::value, T>::type> 
//this doesn't work..
{
    typedef floating_point_validator type;
};
4

3 に答える 3

12

これはあなたが探しているものかもしれません。つまり、タグディスパッチ:

template<typename T, bool = is_integral<T>::value>
struct number_validator {};

template<typename T>
struct number_validator<T, true> 
{
    typedef integral_validator type;
};

template<typename T>
struct number_validator<T, false> 
{
    typedef floating_point_validator type;
};

これは、実際に数値を操作することを前提としているため、型は常に整数または浮動小数点のいずれかです。

于 2013-08-21T18:56:51.173 に答える
1

この場合、それらは必要ありません。実際には、このようにテンプレートを特殊化することができます。

template <typename T>
struct number_validator;
template <>
struct number_validator<float>;

template <>
struct number_validator<int>;

template <>
struct number_validator<double>;

これにより、数値バリデータが型ごとに特化されます。これには、すべての整数型と浮動小数点型をリストする必要があります。次のようなこともできます。

#include <type_traits>
#include <iostream>
template<class T>
typename std::enable_if<std::is_floating_point<T>::value,T>::type func(T t) { 
    std::cout << "You got a floating point" << std::endl;
    return t;
}

template<class T>
typename std::enable_if<std::is_integral<T>::value,T>::type func(T t) { 
    std::cout << "You got an Integral" <<std::endl;
    return t;
}

int main() {
    float f = func(1.0);
    int a = func(2);
}
于 2013-08-21T17:57:47.680 に答える
1

整数でこれを行うことができます:

template <typename T, bool isIntegral = std::is_integral<T>::value>
struct number_validator
{
   typedef WhatEverType type;
};

template <typename T>
struct number_validator<T, true>
{
    typedef WhatEverTypeInt type;
};

整数であれば2番目の特殊化を選択しますが、浮動小数点やその他の型の場合はどうすればよいかわかりません。

于 2013-08-21T18:03:28.773 に答える