如何使用模板根据 class 中的参数设置数组大小
How to have array size depending on parameter in class using template
我有一个由 Q 元组组成的图,其中 Q 为 3 或 6。图中的节点建模为
typedef std::array<int,3> NODE
或 typedef 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-true或statement-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};
}
我有一个由 Q 元组组成的图,其中 Q 为 3 或 6。图中的节点建模为
typedef std::array<int,3> NODE
或 typedef 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-true或statement-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};
}