我有一个用整数模板化的类(即:
template </*...*/, int a> /*...*/
)。在我的课堂上,我想要一个完全接受“a”参数的构造函数。我当然可以让它可变,但如果可能的话,我希望在编译时检查长度。我也认为宏黑客可以工作,但我开始寻找内置的 C++ 功能。
这在 C++ 中是否可行,如果可以,怎么办?
处理一系列相同类型的值是数组的用途。
你甚至不需要使用原始数组;使用 C++11,您可以使用std::array
.
比如像这样:
template< int a >
class MyClass
{
public:
MyClass( std::array< int, a > const& args )
{}
};
如果您的编译器不提供std::array
,那么您可以很容易地定义相应的类,或者您可以只使用原始数组:
template< int a >
class MyClass
{
public:
MyClass( int const (&args)[a] )
{}
};
嗯,我希望我在那里得到了&
正确的位置。由于某种我无法理解的原因,我总是忘记那个语法。不管我用了多少次。
鉴于 OP 在评论中澄清(1)他没有 C++11 和(2)他想要简单的声明语法,如
MyClass<4> m(0,1,2,3);
一种可能性是创建MyClass
一个可以由 C++03 花括号初始化程序初始化的聚合,即没有用户定义的构造函数:
#include <stddef.h>
typedef ptrdiff_t Size;
typedef Size Index;
template< Size a >
class MyClass
{
public:
static Size const n = a;
static Size size() { return n; }
int elems_[n];
int operator[]( Index const i ) const { return elems_[i]; }
int& operator[]( Index const i ) { return elems_[i]; }
};
#include <iostream>
using namespace std;
int main()
{
MyClass< 3 > x = {100, 200, 300};
for( int i = 0; i < x.size(); ++i )
{
wcout << x[i] << endl;
}
}
如果这个解决方案是可以接受的,那么本质上就是重新实现std::array
.