【发布时间】:2018-11-01 21:10:16
【问题描述】:
我有一个要求,其中有一个枚举,并且为长度为 l 的所有可能的枚举组合定义了模板函数。
说枚举是
Enum typenum {A, B, C}
所有这些模板函数都是在运行时定义和可用的(即编译器在编译时创建这些函数)
Alpha<A>::f()
Alpha<B>::f()
Alpha<C>::f()
Alpha<A,A>::f()
Alpha<A,B>::f()
Alpha<A,C>::f()
Alpha<B,A>::f()
Alpha<B,B>::f()
Alpha<B,C>::f()
Alpha<C,A>::f()
Alpha<C,B>::f()
Alpha<C,C>::f()
and combination of 3 enums, 4 enums...
现在我必须根据输入向量选择正确的函数
void f(vector<enum> eVec){
Alpha::f<eVec[0], eVec[1],... eVec[eVec.size() - 1]>() // <-------
我该怎么做?一种方法是为每个尺寸定义。例如:
if(eVec.size() == 1)
Alpha<eVec[0]>::f()
else if(eVec.size() == 2)
Alpha<eVec[0], eVec[1]>::f()
但这不会扩展。是否有任何优雅、可扩展的方式来做到这一点。
【问题讨论】:
-
你确定模板是正确的方法吗?这似乎是不必要的复杂
-
是的,这是非常复杂的代码的一部分,在这里很难解释。我试图将其压缩到最低限度。
-
语言是什么? C++?
-
是的,它是 C++。
-
C++11、C++14 还是 C++17?另一个问题:我们可以想象向量长度的上限值吗?以 10 为例?
标签: c++ c++11 templates variadic-templates template-meta-programming