如何在函数签名样式中传递size_t模板参数?

时间:2016-10-17 09:04:41

标签: c++ templates

我想定义一个类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值在括号中传递。有谁知道如何实现这一点?

非常感谢提前。

1 个答案:

答案 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)可读性将比你开始时更差。