只是返回非类型参数

时间:2018-12-20 04:59:51

标签: c++ templates

我刚刚通过模板使用 non-type 参数学习了编译时数组声明。因此,在这种方法中,我们传递常量,并声明具有大小的数组。 喜欢

#include<iostream>
using namespace std;

template<int size_of_array>
class arr 
{
public:
    int  arr[size_of_array];

    int size_of() { return size_of_array;   }
};

int main() 
{
    arr<4> arr1;
    cout << arr1.size_of();

    return 0;
}

我们是否可以在运行时执行类似变量值分配的操作,例如从此处删除arr[]。 喜欢

#include<iostream>
using namespace std;

template<int size_of_array>
class arr 
{
public:
    int  size_of_array;
    int size_of() { return size_of_array;   }
};

int main() 
{
    arr<4> arr1;
    cout << arr1.size_of();

    return 0;
}

我们能做到吗?还是为什么不呢?然后也许有一些我不知道的关于数组和变量声明的东西。预先谢谢你。

1 个答案:

答案 0 :(得分:3)

绝对!您可以通过编写一个函数来传递模板参数。

您的尝试仅因以下原因而失败:

  • 您尝试将模板参数名称重新用作数据成员名称,并且
  • 您从未真正为数据成员分配值。

实际上,这里确实不需要额外的数据成员,因为在整个类定义中都可以访问template参数。

因此,对于像您这样的非类型模板参数,只需:

template <int size_of_array>
class arr 
{
public:
    static int size_of() { return size_of_array; }
};

现在arr<42>::size_of()是42!

(我将其设置为static,不是因为您需要,而是因为在此示例中它是有道理的;您也可以将其设置为非static,但将其设置为{{1 }}成员函数。)

对于类型:

const

现在template <typename T> class arr { public: using array_size_t = T; }; 是类型arr<T>::array_size_t