如何使用模板根据 class 中的参数设置数组大小

How to have array size depending on parameter in class using template

我有一个由 Q 元组组成的图,其中 Q 为 3 或 6。图中的节点建模为 typedef std::array<int,3> NODEtypedef std::array<int,6> NODE 分别。为了更加灵活,我使用了模板 class

template <int Q>
class DARP
{
// some attributes
    int capacity = Q;
    typedef std::array<int,Q> NODE;
    NODE depot;
    void create_nodes();
};

但是,下面的实现会导致错误。

template <int Q>
void DARP<Q>::create_nodes()
{
    if (capacity == 3)
        depot = {0,0,0};
    else
        depot = {0,0,0,0,0,0};  
}

这可以通过

解决
template <int Q>
void DARP<Q>::create_nodes()
{
    for (int i=0; i<Q; i++)
    {
        depot[i] = 0;
    }
}

但是当我想创建像 {0,1,4,8,9,10} 这样更复杂的节点时,能够以这种“简短”形式编写它会派上用场。有什么办法可以更优雅地处理这个问题吗?

您可以将 Constexpr If(C++17 起)与模板参数 Q 一起使用,如:

if constexpr (Q==3)
    depot = {0,0,0};
else
    depot = {0,0,0,0,0,0};  

根据条件值,statement-truestatement-false将被丢弃,不会导致错误.

在 C++17 之前,您可以将 create_nodes 指定为:

template <>
void DARP<3>::create_nodes()
{
    depot = {0,0,0};
}
template <>
void DARP<6>::create_nodes()
{
    depot = {0,0,0,0,0,0}; 
}