首页 > 解决方案 > 只返回非类型参数

问题描述

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

#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;
}

我们可以这样做吗?或者为什么不呢?那么也许有一些我不知道的关于数组和变量声明的事情。先感谢您。

标签: c++templates

解决方案


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

您的尝试失败只是因为:

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

无论如何,这里实际上不需要额外的数据成员,因为模板参数可以在整个类定义中访问。

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

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

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

(我做到了static,不是因为你需要,而是因为在这个例子中它是有意义的;你也可以让它成为一个非但static成员const函数。)

对于一个类型:

template <typename T>
class arr 
{
public:
    using array_size_t = T;
};

现在arr<T>::array_size_t是类型T


推荐阅读