gpt4 book ai didi

c++ - 将#ifdef 转换为 C++ 中的模板元程序

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:30:46 24 4
gpt4 key购买 nike

我在 C++ 类中有以下代码:

class Features
{
#define Feature_Size_A 12345
#define Feature_Size_B 45678
#define Feature_Size_C 78901
//#define Feature_Size_D 14725

const int Feature_Sum = 0
#ifdef Feature_Size_A
+ Feature_Size_A
#endif
#ifdef Feature_Size_B
+ Feature_Size_B
#endif
#ifdef Feature_Size_C
+ Feature_Size_C
#endif
#ifdef Feature_Size_D
+ Feature_Size_D
#endif
;

#ifdef Feature_Size_A
static float Feature_A[Feature_Size_A];
#endif
#ifdef Feature_Size_B
static float Feature_B[Feature_Size_B];
#endif
#ifdef Feature_Size_C
static float Feature_C[Feature_Size_C];
#endif
#ifdef Feature_Size_D
static float Feature_D[Feature_Size_D];
#endif
};

我曾经注释掉功能,比如第 4 行,以编译和运行不同的测试。但现在我想将该类作为模板,这样我就可以在同一个程序中实例化多个具有不同功能的版本。

我在想这样的事情:

template <bool Feature_A, bool Feature_B, bool Feature_C, bool Feature_D>
class Features
{
...
};

Features<true, true, true, false> f;

我试过使用 boost::mpl:vector's,但我挣扎得很厉害。

顺便说一句:这不是完整的代码。原始代码有 25 个特征。

我感谢每一个不涉及宏的想法:-)

最佳答案

类型列表可以用来解决这个问题。

template<unsigned num, unsigned size, typename T>
class Feature : public T
{
public:
static float feature[size];
static const unsigned int feature_sum = size + T::feature_sum;
};
template<unsigned num, unsigned size, typename T>
float Feature<num, size, T>::feature[size];
class Tail {
public:
static const unsigned feature_sum = 0;
};

template<unsigned num, unsigned size, typename T>
float* get_feature_arr(Feature<num, size, T>& ref)
{
return ref.feature;
}

int main() {
Feature<1, 12345, Feature<2, 45678, Feature<4, 78901, Tail>>> TripleFeatures;
auto first = get_feature_arr<1>(TripleFeatures);
auto third = get_feature_arr<4>(TripleFeatures);
auto size = TripleFeatures.feature_sum;
}

这也可用于访问任何功能,无论列表中是否有其他功能。

编辑:我忽略了一些细节,比如没有定义数组并尝试将“3features”作为标识符。勒不动。代码编译 GCC 4.7.1。

关于c++ - 将#ifdef 转换为 C++ 中的模板元程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12282036/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com