gpt4 book ai didi

c++ - 是否有等效于 #if 的可以评估模板参数?

转载 作者:太空狗 更新时间:2023-10-29 20:10:41 24 4
gpt4 key购买 nike

#if 预处理器指令评估预处理器已知的“常量”表达式。有没有类似的东西可以计算模板参数的表达式?

在实践中,我有这样的事情:

template<int i>    
class Elem{ /*...*/};

#ifndef NUM_ELEM
#define NUM_ELEM 2
#endif

class MyClass
{

#if NUM_ELEM >= 1
Elem<1> e_1;
#endif
#if NUM_ELEM >= 2
Elem<2> e_2;
#endif
#if NUM_ELEM >= 3
Elem<3> e_3;
#endif

/*...*/
}

但我真的很想将 MyClass 本身变成一个模板:

template<int num_elem>
MyClass{

#if num_elem >= 1 //but #if can't understand num_elem
Elem<1> e_1;
#endif
#if num_elem >= 2
Elem<2> e_2;
#endif
#if num_elem >= 3
Elem<3> e_3;
#endif

/*...*/
};

最佳答案

简短的回答是否定的,但如果您愿意稍微更改您的要求,您可以执行以下操作:

// A run of elements - Elem<n>, ..., Elem<2>, Elem<1>
template <int n> class NumElems
{
template <int u, int v> friend class ElemGetter;

NumElems<n-1> before;

public:
Elem<n> e;

// method to retrieve an element by number
template <int m> Elem<m> &getElem();
};

// helper class to retrieve an element.
// 'n' is the element number to retrieve
// 'm' is the number of elements
// by default, ElemGetter<n,m> defers to ElemGetter<n,m-1>.
template <int n, int m> class ElemGetter
{
public:
static Elem<n> &getElem(NumElems<m> &numElems)
{
return ElemGetter<n,m-1>::getElem(numElems.before);
}
};

// specialisation of ElemGetter: if the element to get is the same as the
// number of elements (i.e. is the last element) then return it
// immediately.
template <int n> class ElemGetter<n,n>
{
public:
static Elem<n> &getElem(NumElems<n> &numElems)
{
return numElems.e;
}
};

// get an element by number; defers to the ElemGetter helper.
template <int n> template <int m> Elem<m> &NumElems<n>::getElem()
{
return ElemGetter<m,n>::getElem(*this);
}

template <> class NumElems<0>
{
};

...然后您可以声明您的 Elem 成员集:

NumElems<NUM_ELEM> elems;

您可以使用以下方式访问它们:

Elem<2> &e = elems.getElem<2>();

原始建议代码

我提出的原始代码实际上并没有编译,但我将其包含在这里,因为它更好地展示了上述的意图:

// Original, doesn't compile - but it would be nice if it did :/
template <int n> class NumElems : private NumElems<n-1>
{
Elem<n> e;

template <int m> Elem<m> &getElem()
{
return NumElems<n-1>::getElem<m>();
}

template <> Elem<n> &getElem<n>()
{
return e;
}
};

template <> class NumElems<0>
{
};

不幸的是,C++ 不允许以这种方式对成员模板函数进行专门化,尽管(对我而言)不清楚为什么不这样做 - 代码肯定更简单,无需创建辅助类,如上面的工作代码所示。

关于c++ - 是否有等效于 #if 的可以评估模板参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37788131/

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