整数和实数类型的不同模板行为

弗拉顿

如何为不同类型(某种伪语言)创建具有不同行为的模板,例如:

template <typename T>
T GetRand(T param)
{
    if (T is of any real type) {
        // use uniform_real_distribution
    }

    if (T is of any integer type) {
        // use uniform_int_distribution
    }

    if (T is of any other type) {
        // do nothing
    }
}

那些怎么写if T is of xxx type

如果可以的话,我使用C ++ 11。

巴里

您可以在的每个重载上使用SFINAE GetRand,但有时使用tag-dispatch变得容易得多。我们将为每个潜在的重载选择一个唯一的类型(“T是任何实数类型”,“T是任何整数类型”,“其他”),并构造正确的类型作为辅助函数的第二个参数。

首先,我们必须选择正确的标签:

struct integral_tag{};
struct floating_tag{};
struct other_tag{};

template <typename T>
struct get_tag 
: std::conditional<
    std::is_integral<T>::value,
    integral_tag,
    typename std::conditional<
        std::is_floating_point<T>::value,
        floating_tag,
        other_tag>::type
    > 
{ };

template <typename T>
using get_tag_t = typename get_tag<T>::type;

然后,我们使用该类型特征进行转发:

template <typename T>
T GetRand(T param) {
    return GetRand(param, get_tag_t<T>{} );
}

然后只写那些重载:

template <typename T>
T GetRand(T param, integral_tag ) { ... };

template <typename T>
T GetRand(T param, floating_tag ) { ... };

template <typename T>
T GetRand(T param, other_tag ) { ... };

就个人而言,我认为这更容易阅读。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

static_assert取决于非类型模板参数(gcc和clang的不同行为)

来自分类Dev

如何比较实数和整数?

来自分类Dev

C ++模板中的类型优先级和整数类型

来自分类Dev

C ++模板中的类型优先级和整数类型

来自分类Dev

C ++重载函数和函数模板-不同的行为?

来自分类Dev

C ++重载函数和函数模板-不同的行为?

来自分类Dev

std :: array集合初始化和模板整数类型

来自分类Dev

如何分别专门针对整数和浮点类型的模板函数?

来自分类Dev

枚举和所有其他类型的行为不同

来自分类Dev

模板不同的返回类型

来自分类Dev

具有不同数量和参数类型的模板功能

来自分类Dev

在实数浮点数和整数之间进行转换

来自分类Dev

在给定范围内生成随机整数和实数

来自分类Dev

在实数浮点数和整数之间进行转换

来自分类Dev

C ++模板元编程:使用类型别名与继承的不同行为

来自分类Dev

模板重载的行为与非模板重载的行为不同

来自分类Dev

实数的SML幂与整数

来自分类Dev

处理模板生成和静态constexpr成员时,clang和gcc的行为不同?

来自分类Dev

具有enable_if的C ++模板重载:g ++和clang的不同行为

来自分类Dev

REQUIRE_BASE_URL与模板标签和shell命令的不同行为

来自分类Dev

对于负整数,为什么C和Ruby之间的模运算符(%)的行为不同?

来自分类Dev

R data.table-整数/数字和字符列的不同联接行为

来自分类Dev

LINQ-Sum的不同行为和手动添加整数值

来自分类Dev

对于负整数,为什么C和Ruby之间的模运算符(%)的行为不同?

来自分类Dev

如何从模板类型数组获取整数类型

来自分类Dev

Access修饰符在继承中的不同行为取决于“ this”关键字和模板或缺少模板

来自分类Dev

C ++模板类型和模板类型

来自分类Dev

Swift 可选模板类型意外的参数行为

来自分类Dev

如何编写模板函数来添加整数但连接字符串和字符类型?

Related 相关文章

  1. 1

    static_assert取决于非类型模板参数(gcc和clang的不同行为)

  2. 2

    如何比较实数和整数?

  3. 3

    C ++模板中的类型优先级和整数类型

  4. 4

    C ++模板中的类型优先级和整数类型

  5. 5

    C ++重载函数和函数模板-不同的行为?

  6. 6

    C ++重载函数和函数模板-不同的行为?

  7. 7

    std :: array集合初始化和模板整数类型

  8. 8

    如何分别专门针对整数和浮点类型的模板函数?

  9. 9

    枚举和所有其他类型的行为不同

  10. 10

    模板不同的返回类型

  11. 11

    具有不同数量和参数类型的模板功能

  12. 12

    在实数浮点数和整数之间进行转换

  13. 13

    在给定范围内生成随机整数和实数

  14. 14

    在实数浮点数和整数之间进行转换

  15. 15

    C ++模板元编程:使用类型别名与继承的不同行为

  16. 16

    模板重载的行为与非模板重载的行为不同

  17. 17

    实数的SML幂与整数

  18. 18

    处理模板生成和静态constexpr成员时,clang和gcc的行为不同?

  19. 19

    具有enable_if的C ++模板重载:g ++和clang的不同行为

  20. 20

    REQUIRE_BASE_URL与模板标签和shell命令的不同行为

  21. 21

    对于负整数,为什么C和Ruby之间的模运算符(%)的行为不同?

  22. 22

    R data.table-整数/数字和字符列的不同联接行为

  23. 23

    LINQ-Sum的不同行为和手动添加整数值

  24. 24

    对于负整数,为什么C和Ruby之间的模运算符(%)的行为不同?

  25. 25

    如何从模板类型数组获取整数类型

  26. 26

    Access修饰符在继承中的不同行为取决于“ this”关键字和模板或缺少模板

  27. 27

    C ++模板类型和模板类型

  28. 28

    Swift 可选模板类型意外的参数行为

  29. 29

    如何编写模板函数来添加整数但连接字符串和字符类型?

热门标签

归档