C++ 标准::p空气<T,T> 可变参数模板



我遇到了这样的

template<typename T, unsigned int N, std::pair<T,T>... pairs>
struct Base{
static constexpr std::pair<T,T> SOME_STATIC_ARRAY[N] = {pairs...};
};
struct Derived : Base<int,3,std::pair<int,int>(1,2),std::pair<int,int>(2,3),std::pair<int,int>(3,4)>{

};

我想有这样的东西,但我得到了编译错误

A non-type template parameter cannot have type 'std::pair<int, int>'

我怎样才能做到这一点?

非类型模板参数只能是对象类型的短列表之一:

  • 具有积分类型或枚举的值
  • 指向类对象的指针或引用
  • 指向函数的指针或引用
  • 指向类成员函数的指针或引用
  • std::nullptr_t

您临时构建的std::pair实例不在该列表中。模板参数是非常挑剔的方式。我不记得他们如此挑剔的确切原因,但考虑到模板专业化涉及到询问"这些模板参数是否相同";。一般对象的相等性很棘手(通常涉及operator==(,因此将有效值集严格限制在具有琐碎的相等概念的对象上肯定会使编译器更简单。令我非常懊恼的是,您甚至不能将字符串用作非类型模板参数,无论这可能有多么有用!

有两种解决方案可以用来解决这个

  • 不传递N对,而是传递N*2个单独的整数,因为整数是有效的非类型模板参数
  • 使用std::integral_constant传递整数,例如std::pair<std::integral_constant<int, 1>, std::integral_constant<int, 2> >。这不会使生成一对整数,但会生成类型的模板参数,而不是非类型的模板参数。然后,您可以随时从模板化函数中重构std::pair<int, int>
    • 作为一个潜在的更简单的变体,您可以构造自己的template <typename T, T First, T Second> struct pair_integral_constant类,它接受两个相同类型的数字。这是相同的想法:使其成为类型参数,而不是非类型参数

最新更新