具有n个参数的模板专用构造函数

时间:2012-10-06 00:18:49

标签: c++ templates

我有一个用整数模板化的类(即:

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

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

这在C ++中是否可行,如果是这样的话怎么办?

1 个答案:

答案 0 :(得分: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