我有一个与整数模板类(即:模板专门构造函数N个参数
template </*...*/, int a> /*...*/
)。在我的课堂上,我想要一个完全采用“a”参数的构造函数。我当然可以使它可变,但如果可能的话,我希望编译时检查长度。我也认为宏黑客可以工作,但我首先寻找内置的C++功能。
在C++中这是可能的,以及它如何如果这样做呢?
我有一个与整数模板类(即:模板专门构造函数N个参数
template </*...*/, int a> /*...*/
)。在我的课堂上,我想要一个完全采用“a”参数的构造函数。我当然可以使它可变,但如果可能的话,我希望编译时检查长度。我也认为宏黑客可以工作,但我首先寻找内置的C++功能。
在C++中这是可能的,以及它如何如果这样做呢?
用相同类型的值的序列处理是什么阵列对于。
你甚至都不需要使用原始阵列;使用C++ 11,您可以使用std::array
。
E.g.像这样:
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
。
我永远不会忘记的语法。如果你还没有看到或仔细看过它,我希望你能做到,我希望它有帮助。 – chris
std :: array不可用。对于第二个,它看起来正是我想要的,但是我很难定义它。这个螺旋式的技巧看起来很酷,但我甚至不确定上述(完全)在做什么?要清楚,我希望能够做到像“MyClass <4> m(0,1,2,3);”这样的内容。谢谢, – imallett
@IanMallett:给出的代码原来有'&'正确放置,所以没关系。它只涵盖你关于*功能*的原始问题。你现在问的是关于*创建语法*,这需要更复杂的解决方案(你有C++ 11直接方便的语法,但因为你没有'的std :: array'你没有Ç ++ 11)。人们只是为了很好的理由才创建语法,例如在提升组件意味着被重复使用数十亿次。即使如此,对于客户端代码编程人员来说也很难涉及到。 –
你可以与'的sizeof长度编译时检查...'。 http://c-faq.com/decl/spiral.anderson.html:因为只有正确的语法发挥出来,这充分的心理记忆 – chris