注意:这纯粹是为了自我教育。
我有以下模板:
template <typename T, T val>
void Foo() {
static_assert(false, "You should not be here");
}
我想创建许多专业化,例如:
enum class ENUM { A, B };
template<>
void Foo<ENUM, ENUM::A>() {
// something
}
此代码可以正常使用ENUM :: A作为模板参数,并在使用ENUM :: A调用时正确触发static_assert。
问题是 - 这些函数的调用语法非常难看,如下所示:
Foo<ENUM, ENUM::A>();
有没有办法缩短它只是
Foo<ENUM::A>();
但是,保持完整的想法,其他枚举类型可以作为模板参数传递。
以下代码是 NOT 解决方案
template <ENUM val>
void Foo() {} // and further specialize only for values of ENUM
答案 0 :(得分:1)
无法想到一种完全按照自己的意愿去做的方法。
但是,如果您愿意投入一些精力(以某种方式可以减轻,而且在下面),为了使各种版本易于调用,您可以使用std::integral_constant
来制作事物变成了类型;
#include <iostream>
#include <type_traits>
using namespace std;
enum class ENUM{ A, B };
using AT = integral_constant<ENUM, ENUM::A>;
using BT = integral_constant<ENUM, ENUM::B>;
template<typename T>
void Foo();
template<>
void Foo<AT>()
{
cout << "a" << endl;
}
int main ()
{
Foo<AT>();
return 0;
}
为什么这比以前更好?
您可能认为不是!
如果你计划编写很多代码调用这些函数,那么它可能是一种保存。
编写宏来自动化顶部的using
非常容易。