我在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,但是我在挣扎。

顺便说一句:这不是完整的代码。原始代码具有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++ - 在C++中将#ifdef转换为模板元程序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12282036/

10-11 01:19