2

我有一种类似以下的机制,用于为我需要处理的有限数量的不同类型的对象检索某些参数:

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..};
};

它不会编译,因为即使硬编码的数组也是非整数类型。是否有一个简单的补丁来解决这个问题,希望看起来与我目前的使用情况不会有太大的不同?或者有一种方法可以把那个数组的东西放在那里?

4

2 回答 2

2

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

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";
}

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

于 2012-12-06T20:05:29.300 回答
2

可以初始化静态 const 数组,而不是在类内部,就像在这个 Stack Overflow question中一样。挑战在于您必须对每个编译单元进行一次初始化,因此通常在源 (.cpp) 文件中完成,因此,它将远离您的其余初始化,这是相当粗略的。

于 2012-12-06T20:05:37.350 回答