使用枚举类作为模板参数缩短模板函数调用

时间:2016-01-31 16:34:40

标签: c++ templates enums

注意:这纯粹是为了自我教育。

我有以下模板:

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

1 个答案:

答案 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;
}

为什么这比以前更好?

  1. 您可能认为不是!

  2. 如果你计划编写很多代码调用这些函数,那么它可能是一种保存。

  3. 编写宏来自动化顶部的using非常容易。