C ++专门针对枚举的函数

cz

是否可以在上专门化模板功能enum

我看到这里已经指出如果模板函数不是枚举,则可以将其禁用,但是在仍然允许其他类型的情况下可以这样做吗?

下面的示例显示了intfloat和的特化enum(它不会编译,因为它会尝试重载该enum版本而不是对其进行特化)。我觉得我缺少明显的东西。

请注意,我希望专注于任何枚举,而不仅仅是命名枚举(EAnEnum在示例中)

#include <iostream>

enum class EAnEnum
{
    Alpha,
    Beta,
};

template<typename T>
void MyFunc();

template<>
void MyFunc<int>()
{
    std::cout << "Int" << std::endl;
}

template<>
void MyFunc<float>()
{
    std::cout << "Float" << std::endl;
}

// MyFunc<Enum>
template<typename T>
typename std::enable_if<std::is_enum<T>::value, void>::type MyFunc()
{
    std::cout << "Enum" << std::endl;
}

int main()
{
    MyFunc<EAnEnum>();
    return 0;
}
天顶

您不能部分专门化一个函数,但可以改用标记分派
它遵循一个基于OP问题的最小工作示例:

#include <iostream>
#include<type_traits>

enum class EAnEnum
{
    Alpha,
    Beta,
};

template<typename>
struct tag {};

void MyFunc(tag<int>)
{
    std::cout << "Int" << std::endl;
}

void MyFunc(tag<float>)
{
    std::cout << "Float" << std::endl;
}

void MyFunc(tag<EAnEnum>)
{
    std::cout << "Enum" << std::endl;
}

template<typename T>
void MyFunc() {
    MyFunc(tag<std::decay_t<T>>{});
}

int main()
{
    MyFunc<EAnEnum>();
    return 0;
}

您可以轻松地添加要转发到右侧 的参数包,MyFunc并且仍然使用此技术来解决您的问题。
当然,您现在可以专注于任何枚举。
您还可以通过以下方式提供后备MyFunc广告:

template<typename T>
void MyFunc(tag<T>)
{
    std::cout << "Fallback" << std::endl;
}

如果您想要所有可能的枚举类型的后备,现在可以依赖SFINAE,因为它们是不同的重载函数:

template<typename T>
std::enable_if_t<std::is_enum<T>::value>
MyFunc(tag<T>)
{
    std::cout << "Fallback for enums only" << std::endl;
}

请注意,您不应直接使用MyFunc接受tag专业化的含义作为切入点。
这些是内部功能。
如示例中所示,改用通用的。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++:如何专门针对类似于数组数组的类A的成员函数来处理A <A <T>>?

来自分类Dev

C ++专门针对特定类型的lambda

来自分类Dev

C ++:返回枚举的函数

来自分类Dev

专门针对哪个函数重载的规则

来自分类Dev

专门枚举

来自分类Dev

如何在 C++ 中实现 curl --header(专门针对 tdameritrade)

来自分类Dev

C ++-部分专门化模板类成员函数

来自分类Dev

C ++-专门化类模板的成员函数

来自分类Dev

通过参数C ++的类型专门研究重载的构造函数

来自分类Dev

C:指向返回枚举的函数的函数指针

来自分类Dev

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

来自分类Dev

如何覆盖专门针对单元上的类型的组件函数?

来自分类Dev

为C ++中的所有枚举类添加方法专门化

来自分类Dev

C ++中的枚举-函数如何分配值

来自分类Dev

类成员函数中的C ++枚举

来自分类Dev

C中的函数指针和枚举

来自分类Dev

基于枚举值的C ++调用函数

来自分类Dev

当C ++中也有非模板函数时,调用专门的模板函数

来自分类Dev

声明C函数的类的朋友并返回C枚举器

来自分类Dev

C编程:使用指针对数组进行排序的函数

来自分类Dev

针对多种架构进行编译时的C ++函数多重定义

来自分类Dev

针对Objective-C枚举的新Swift 5警告:如何消除它们?

来自分类Dev

为什么不能在C ++模板中部分地专门化成员函数

来自分类Dev

如何基于类型相关的类型专门化C ++模板类函数?

来自分类Dev

C ++ 11函数模板专门存在于类方法中(如果存在)

来自分类Dev

专门研究使用通用迭代器作为指针值类型的C ++模板函数吗?

来自分类Dev

如何专门化C ++中的可变参数模板函数?

来自分类Dev

为什么不能在C ++模板中部分地专门化成员函数

来自分类Dev

如何使C ++模板化函数与返回类型无关,以便将来进行专门化

Related 相关文章

  1. 1

    C ++:如何专门针对类似于数组数组的类A的成员函数来处理A <A <T>>?

  2. 2

    C ++专门针对特定类型的lambda

  3. 3

    C ++:返回枚举的函数

  4. 4

    专门针对哪个函数重载的规则

  5. 5

    专门枚举

  6. 6

    如何在 C++ 中实现 curl --header(专门针对 tdameritrade)

  7. 7

    C ++-部分专门化模板类成员函数

  8. 8

    C ++-专门化类模板的成员函数

  9. 9

    通过参数C ++的类型专门研究重载的构造函数

  10. 10

    C:指向返回枚举的函数的函数指针

  11. 11

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

  12. 12

    如何覆盖专门针对单元上的类型的组件函数?

  13. 13

    为C ++中的所有枚举类添加方法专门化

  14. 14

    C ++中的枚举-函数如何分配值

  15. 15

    类成员函数中的C ++枚举

  16. 16

    C中的函数指针和枚举

  17. 17

    基于枚举值的C ++调用函数

  18. 18

    当C ++中也有非模板函数时,调用专门的模板函数

  19. 19

    声明C函数的类的朋友并返回C枚举器

  20. 20

    C编程:使用指针对数组进行排序的函数

  21. 21

    针对多种架构进行编译时的C ++函数多重定义

  22. 22

    针对Objective-C枚举的新Swift 5警告:如何消除它们?

  23. 23

    为什么不能在C ++模板中部分地专门化成员函数

  24. 24

    如何基于类型相关的类型专门化C ++模板类函数?

  25. 25

    C ++ 11函数模板专门存在于类方法中(如果存在)

  26. 26

    专门研究使用通用迭代器作为指针值类型的C ++模板函数吗?

  27. 27

    如何专门化C ++中的可变参数模板函数?

  28. 28

    为什么不能在C ++模板中部分地专门化成员函数

  29. 29

    如何使C ++模板化函数与返回类型无关,以便将来进行专门化

热门标签

归档