当参数类型不属于一组类型时,阻塞一个函数

废话

在特定要求中,我只需要允许func为一组特定的允许类型实例化模板函数

因此,我尝试使用已经可用std::type_traits,然后用于std::enable_if阻止实例化。这是我的实现。

// C++17
#include <vector>
#include <cstdint>
#include <iostream>
#include <type_traits>

using my_int_t      = std::int16_t;         // T1
using my_string_t   = std::string;          // T2
using my_vec_t      = std::vector<int>;     // T3
// and so on .. a long list of types 


/* Check input Type T : if it belongs to {T1,T2,T3} 
If it belongs then only allow this version of func to instantiate
*/
template<typename T, typename T1,typename T2,typename T3>
using isCompatible = std::bool_constant<std::is_same_v<T,T1>
                            || std::is_same_v<T,T2>
                            || std::is_same_v<T,T3> >;

template<typename T>
using CompatibleTypeCheck = std::enable_if_t< isCompatible<std::remove_reference_t<T>,
                                                    my_int_t,
                                                    my_string_t,
                                                    my_vec_t>::value >;



template<typename T,
        typename = CompatibleTypeCheck<T>>
void func(T&& val) {
    std::cout <<"Hello from Generic Func" << std::endl;
}


int main() {

    // int z = 10;   
    // func(z); // Error ! as expected

    my_int_t w = 100;
    func(w); // OK
}

但是问题是允许的类型太多。是否有更好的方法来清除两个别名模板?isCompatibleCompatibleTypeCheck

如果有更好的“惯用”方式来达到相同的结果,请提出建议。

慈济

您可以这样写isCompatible

template<typename T, typename ...Ts> 
using isCompatible = std::bool_constant<(std::is_same_v<T,Ts> || ...)>;

您无能为力,CompatibleTypeCheck因为您需要在某个地方指定所有允许的类型。

这是一个演示


请注意,enable_if通常在要启用或禁用特定的重载时使用。在您的情况下,更简单的方法是仅static_assert在函数定义内部:

template<typename T>
void func(T&& val) {
    static_assert(isCompatible<std::remove_reference_t<T>,
                                                    my_int_t,
                                                    my_string_t,
                                                    my_vec_t>::value);
    std::cout <<"Hello from Generic Func" << std::endl;
}

这样就CompatibleTypeCheck完全不需要了

这是一个演示

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何选择属于一个组而不属于另一个组的项目

来自分类Dev

结构中的成员不属于任何类型吗?和一个持有一个孤独变量的结构

来自分类Dev

列出不属于多个组之一的AD用户

来自分类Dev

在yii2中添加一个不属于同一模型的textinput

来自分类Dev

{0,1}上不属于递归可枚举集的一组语言是不可数的

来自分类Dev

选择不属于另一个表中的条目的条目

来自分类Dev

SQL:需要选择一个忽略不属于类别的结果的答案

来自分类Dev

SQL Server - 在链中找到一个不属于任何人的字母

来自分类Dev

Javascript / Jquery-如何替换一个单词,但仅当不属于另一个单词时才替换?

来自分类Dev

在为“多对一”关系建模时,如何处理“多”侧不属于“一个”侧任何记录的记录?

来自分类Dev

比较Google表格中的2个范围和不属于第一个范围的返回值

来自分类Dev

EF在数据库中创建一个关系ID列,该列不属于模型

来自分类Dev

一个或两个数字的正则表达式模式,不属于4数字组

来自分类Dev

有什么好的算法可以删除不属于至少一个循环的图形的所有边?

来自分类Dev

仅对间隔不属于另一个data.frame的那些行进行子集

来自分类Dev

选择不属于返回的接口类型的属性时,TypeScript编译错误

来自分类Dev

将属性从一个bean递归复制到另一个(不属于同一类)(包括嵌套bean)

来自分类Dev

DWScript:传递一组枚举类型将传递一个整数数组

来自分类Dev

根据一组具有混合数值类型的范围创建一个DataFrame

来自分类Dev

PHP仅在不属于另一个子字符串的情况下才找到一个子字符串

来自分类Dev

使用Java流过滤器获取一个列表中不属于另一个列表的对象的列表

来自分类Dev

函数是否可能仅接受给定参数的一组有限类型?

来自分类Dev

函数是否可能仅接受给定参数的一组有限类型?

来自分类Dev

了解装饰器:未指定参数时,返回类型是一个函数

来自分类Dev

当其中一个参数是动态的时,如何获取类型的构造函数?

来自分类Dev

当其中一个参数是动态的时,如何获取类型的构造函数?

来自分类Dev

引用当前函数的第一个参数类型

来自分类Dev

EF:对于使用存储过程的当前上下文,实体类型不属于模型的一部分

来自分类Dev

带一个或一组对象的Typescript函数

Related 相关文章

  1. 1

    如何选择属于一个组而不属于另一个组的项目

  2. 2

    结构中的成员不属于任何类型吗?和一个持有一个孤独变量的结构

  3. 3

    列出不属于多个组之一的AD用户

  4. 4

    在yii2中添加一个不属于同一模型的textinput

  5. 5

    {0,1}上不属于递归可枚举集的一组语言是不可数的

  6. 6

    选择不属于另一个表中的条目的条目

  7. 7

    SQL:需要选择一个忽略不属于类别的结果的答案

  8. 8

    SQL Server - 在链中找到一个不属于任何人的字母

  9. 9

    Javascript / Jquery-如何替换一个单词,但仅当不属于另一个单词时才替换?

  10. 10

    在为“多对一”关系建模时,如何处理“多”侧不属于“一个”侧任何记录的记录?

  11. 11

    比较Google表格中的2个范围和不属于第一个范围的返回值

  12. 12

    EF在数据库中创建一个关系ID列,该列不属于模型

  13. 13

    一个或两个数字的正则表达式模式,不属于4数字组

  14. 14

    有什么好的算法可以删除不属于至少一个循环的图形的所有边?

  15. 15

    仅对间隔不属于另一个data.frame的那些行进行子集

  16. 16

    选择不属于返回的接口类型的属性时,TypeScript编译错误

  17. 17

    将属性从一个bean递归复制到另一个(不属于同一类)(包括嵌套bean)

  18. 18

    DWScript:传递一组枚举类型将传递一个整数数组

  19. 19

    根据一组具有混合数值类型的范围创建一个DataFrame

  20. 20

    PHP仅在不属于另一个子字符串的情况下才找到一个子字符串

  21. 21

    使用Java流过滤器获取一个列表中不属于另一个列表的对象的列表

  22. 22

    函数是否可能仅接受给定参数的一组有限类型?

  23. 23

    函数是否可能仅接受给定参数的一组有限类型?

  24. 24

    了解装饰器:未指定参数时,返回类型是一个函数

  25. 25

    当其中一个参数是动态的时,如何获取类型的构造函数?

  26. 26

    当其中一个参数是动态的时,如何获取类型的构造函数?

  27. 27

    引用当前函数的第一个参数类型

  28. 28

    EF:对于使用存储过程的当前上下文,实体类型不属于模型的一部分

  29. 29

    带一个或一组对象的Typescript函数

热门标签

归档