2012-10-06 44 views
0

我有一个与整数模板类(即:模板专门构造函数N个参数

template </*...*/, int a> /*...*/ 

)。在我的课堂上,我想要一个完全采用“a”参数的构造函数。我当然可以使它可变,但如果可能的话,我希望编译时检查长度。我也认为宏黑客可以工作,但我首先寻找内置的C++功能。

在C++中这是可能的,以及它如何如果这样做呢?

+0

你可以与'的sizeof长度编译时检查...'。 http://c-faq.com/decl/spiral.anderson.html:因为只有正确的语法发挥出来,这充分的心理记忆 – chris

回答

2

用相同类型的值的序列处理是什么阵列对于。

你甚至都不需要使用原始阵列;使用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

+1

我永远不会忘记的语法。如果你还没有看到或仔细看过它,我希望你能做到,我希望它有帮助。 – chris

+1

std :: array不可用。对于第二个,它看起来正是我想要的,但是我很难定义它。这个螺旋式的技巧看起来很酷,但我甚至不确定上述(完全)在做什么?要清楚,我希望能够做到像“MyClass <4> m(0,1,2,3);”这样的内容。谢谢, – imallett

+0

@IanMallett:给出的代码原来有'&'正确放置,所以没关系。它只涵盖你关于*功能*的原始问题。你现在问的是关于*创建语法*,这需要更复杂的解决方案(你有C++ 11直接方便的语法,但因为你没有'的std :: array'你没有Ç ++ 11)。人们只是为了很好的理由才创建语法,例如在提升组件意味着被重复使用数十亿次。即使如此,对于客户端代码编程人员来说也很难涉及到。 –