有没有办法将数组行为作为静态结构数据成员?

时间:2012-12-06 19:55:59

标签: c++ templates static-members

我有一个像下面这样的机制来检索我需要处理的有限数量的不同类型对象的某些参数:

template <class T>
struct params {};

template <>
struct params<FooObj>
{
    static const int paramA = 17;
    static const int paramB = 29;
};

这稍后简化了我的代码,因为在处理不同对象的switch语句中,如果我得到FooObj,那么我所要做的就是这样:

typedef params<FooObj> paramsT;

然后在该代码段中,我可以通过FooObj或其他方式访问参数以使用paramsT::paramC

现在我遇到了一个对象,我有这样的东西:

template <>
struct params<BarObj>
{
    static const int paramA  = 0;
    static const int paramB  = 9;
    static const int paramC  = 17;
    static const int paramD1 = 18;
    static const int paramE1 = 20;
    static const int paramD2 = 28;
    static const int paramE2 = 30;
    static const int paramD3 = 38;
    static const int paramE3 = 40;
    static const int paramD4 = 48;
    static const int paramE4 = 50;
    static const int paramD5 = 58;
    static const int paramE5 = 60;
    static const int paramD6 = 68;
    static const int paramE6 = 70;
};

当我处理这个对象时,我开始编写如下内容:

typedef params<BarObj> paramsT;
BarObj bar;
//load the first 3 params via the above info into bar

int a,b;
for (int i = 1; i <= 6; ++i)
{
    a = doSomethingA(bla + paramsT::paramD1);
    b = doSomethingB(bla + paramsT::paramE1);
    bla.paramD1 = functionOf(stuff,and,a,b);
}

但当然上面有1硬编码,理想情况下会读到这样的内容:

typedef params<BarObj> paramsT;
BarObj bar;
//load the first 3 params via the above info into bar

int a,b;
for (int i = 0; i < 6; ++i)
{
    a = doSomethingA(bla + paramsT::paramD[i]);
    b = doSomethingB(bla + paramsT::paramE[i]);
    bla.paramD[i] = functionOf(stuff,and,a,b);
}

虽然对于像上面这样的东西,我需要params模板专门化是这样的:

template <>
struct params<BarObj>
{
    static const int paramA   = 0;
    static const int paramB   = 9;
    static const int paramC   = 17;
    static const int paramD[] = {18, etc..};
    static const int paramE[] = {20, etc..};
};

不能编译,因为即使硬编码的数组也是非整数类型。是否有一个简单的补丁,不希望看起来与我目前的用法有太大不同?或者在那里获得那些数组的方法?

2 个答案:

答案 0 :(得分:2)

“静态隐式内联函数静态局部变量”hack:

template<typename T>
struct params;
struct Bob;
template<>
struct params<Bob> {
  static int paramE(unsigned int idx) {
    static const int v[] = {18, 20, 22, 24};
    return v[idx];
  }
};

#include <iostream>
int main() {
  for(auto i = 0; i < 4; ++i)
    std::cout << params<Bob>::paramE(i) << "\n";
}

请注意,结果值不是“编译时间常量”(即,不能用于模板参数之类的东西),但编译器优化为常量是微不足道的。

答案 1 :(得分:2)

可以初始化静态const数组,而不是在this Stack Overflow question中。挑战在于你必须为每个编译单元进行一次初始化,因此它通常在源(.cpp)文件中完成,因此,它将远离初始化的其余部分,这是非常严重的。 / p>