具有 std::if_enabled_t 参数的模板函数的完全专业化
full specialization of template functions with std::if_enabled_t parameter
我正在尝试编写一个函数,为所有非枚举类型实现通用行为,为所有枚举类型实现通用行为,然后能够通过完全专门化某些类型的特定行为专门化功能。到目前为止,这是我的代码:
// Func.h
#include <cstdio>
#include <type_traits>
template <typename T, std::enable_if_t<!std::is_enum<T>{}>* = nullptr >
void Func()
{
printf("General case\n");
}
template <typename T, std::enable_if_t<std::is_enum<T>{}>* = nullptr >
void Func()
{
printf("enum\n");
}
template <>
void Func<bool>()
{
printf("bool\n");
}
// main.cpp
#include <Func.h>
enum Enum
{
A,
B
};
int main()
{
Func<float>();
Func<Enum>();
Func<bool>();
}
它无法编译,我真的不知道如何正确编译。如果我像上面的代码那样使用专门的原型,我会得到这个链接错误:
error LNK2005: "void __cdecl Func<bool,0>(void)" (??$Func@_N[=12=]A@@@YAXXZ) already defined in main.obj
如果我制作专用原型 template<> void Func<bool, nullptr>()
,我会收到此编译错误:
error C2912: explicit specialization 'void Func<bool,nullptr>(void)' is not a specialization of a function template
这些测试是使用 Visual Studio 2015 编译器和 c++14 标准
完成的
我不知道从这里去哪里,任何帮助将不胜感激
您收到链接错误,因为 Func<bool>()
是在包含在多个编译单元中的头文件中定义的。解决方法很简单:把inline
放在void Func<bool>()
之前:
template<>
inline void Func<bool>()
{
// ...
}
函数模板是隐式的 inline
,但是函数和显式模板特化 。如果它们在头文件中定义,则应标记为 inline
.
我正在尝试编写一个函数,为所有非枚举类型实现通用行为,为所有枚举类型实现通用行为,然后能够通过完全专门化某些类型的特定行为专门化功能。到目前为止,这是我的代码:
// Func.h
#include <cstdio>
#include <type_traits>
template <typename T, std::enable_if_t<!std::is_enum<T>{}>* = nullptr >
void Func()
{
printf("General case\n");
}
template <typename T, std::enable_if_t<std::is_enum<T>{}>* = nullptr >
void Func()
{
printf("enum\n");
}
template <>
void Func<bool>()
{
printf("bool\n");
}
// main.cpp
#include <Func.h>
enum Enum
{
A,
B
};
int main()
{
Func<float>();
Func<Enum>();
Func<bool>();
}
它无法编译,我真的不知道如何正确编译。如果我像上面的代码那样使用专门的原型,我会得到这个链接错误:
error LNK2005: "void __cdecl Func<bool,0>(void)" (??$Func@_N[=12=]A@@@YAXXZ) already defined in main.obj
如果我制作专用原型 template<> void Func<bool, nullptr>()
,我会收到此编译错误:
error C2912: explicit specialization 'void Func<bool,nullptr>(void)' is not a specialization of a function template
这些测试是使用 Visual Studio 2015 编译器和 c++14 标准
完成的我不知道从这里去哪里,任何帮助将不胜感激
您收到链接错误,因为 Func<bool>()
是在包含在多个编译单元中的头文件中定义的。解决方法很简单:把inline
放在void Func<bool>()
之前:
template<>
inline void Func<bool>()
{
// ...
}
函数模板是隐式的 inline
,但是函数和显式模板特化 inline
.