我想定义一个类A
,它需要一个类型T
和一个任意数量的size_t N_i...
作为其模板参数:
template< typename T, size_t... N_i>
class A
{
// ...
};
根据A
上面的定义,我必须以A
的形式将模板参数传递给A<float,1,2,3> a
(对于T=float
和{{的示例案例然而,1}})
为了更好的阅读,我更喜欢(函数签名样式)语法,即N_i...=1,2,3
,其中size_t值在括号中传递。有谁知道如何实现这一点?
非常感谢提前。
答案 0 :(得分:0)
你不能在C ++中拥有完全相同的语法(带括号的列表将是一个包含逗号运算符的表达式,将等于最后一个值)。
编辑以下初稿不会起作用:粗略地说,非类型参数必须是整数/枚举类型,引用或某种指针。有关实际的详尽列表,请参阅this list。
如果您准备接受花括号:
template< typename T, std::initializer_list<size_t> N_i>
class A
{
// ...
};
A<float, {1,2,3}> a;
修改强> 您可以通过将其更改为:
来强制它工作template< typename T, const std::initializer_list<size_t> *N_i>
class A
{
// ...
};
const std::initializer_list<size_t> a_arg{1,2,3}
A<float, &a_arg> a;
但这打破了可读性&#34;可怕。
还有其他涉及魔术类型的复杂解决方案,它具有合适的逗号运算符,但是a)使得可接受的模板参数很难; b)可读性将比你开始时更差。