是否可以在上专门化模板功能enum
?
我看到这里已经指出,如果模板函数不是枚举,则可以将其禁用,但是在仍然允许其他类型的情况下可以这样做吗?
下面的示例显示了int
,float
和的特化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] 删除。
我来说两句