C++ 我可以使用模板设置数组大小吗?
所以,我不熟悉使用模板,我有一个问题。由于模板是在编译时处理的,数组大小必须在编译时设置,我可以使用模板来设置数组大小吗C++ 我可以使用模板设置数组大小吗?,c++,C++,所以,我不熟悉使用模板,我有一个问题。由于模板是在编译时处理的,数组大小必须在编译时设置,我可以使用模板来设置数组大小吗 template<const size_t N> struct Stats { // Member functions (omitted). // The stats themselves. int stats[N]; }; class DudeWithStats { public: void setStats(
template<const size_t N> struct Stats {
// Member functions (omitted).
// The stats themselves.
int stats[N];
};
class DudeWithStats {
public:
void setStats(int sts[], size_t sz, bool derived = false);
// Other member functions (omitted).
private:
Stats<8> base;
Stats<5> derived;
// Other member variables (omitted).
};
void DudeWithStats::setStats(int sts[], size_t sz, bool drvd /* = false */) {
for (int i = 0; i < sz; i++) {
if (drvd) {
derived.stats[i] = sts[i];
} else {
base.stats[i] = sts[i];
}
}
}
int main() {
int arrBase[8] = { 10, 20, 10, 10, 30, 10, 15, 6 };
int arrDerived[5] = { 34, 29, 42, 100, 3 };
DudeWithStats example;
example.setStats(arrBase, 8);
example.setStats(arrDerived, 5, true);
}
模板结构统计信息{
//成员函数(省略)。
//统计数据本身。
int stats[N];
};
阶级与国家{
公众:
无效设置状态(int sts[],size_t sz,bool-derived=false);
//其他成员函数(省略)。
私人:
统计基础;
统计数据来源;
//其他成员变量(省略)。
};
无效状态::设置状态(int sts[],size_t sz,bool drvd/*=false*/){
对于(int i=0;i
我可以看到用new
或std::vector
创建一个动态数组是可行的,但我很好奇这是否可行
(是的,我知道const
在模板声明中是毫无意义的,至少对编译器来说是这样。它主要用于文档编制。)
提前谢谢
(编辑:注意到我在setStats()的定义中有默认参数。修复了它。我相信也修复了函数本身(以前从未直接复制过数组)。)
(编辑:将其切换为大小。仍在努力使setStats()正常工作,我可能会坚持手动传递统计数据,而不是作为数组。)
(编辑:只是使用了一种变通方法使setStats()正常工作。它看起来有点笨拙,但对于测试代码来说已经足够好了。)
谢谢大家的回答和帮助。我将使用类似的东西来满足我的需要,并随着我在编码方面的进步对其进行改进。关于模板的内容,你是完全正确的。模板(可能太)灵活,系统(IMHO)只能由Haskell比较 无论如何,GCC不会喜欢您的代码:
c.cpp:21:57: error: default argument given for parameter 2 of ‘void DudeWithStats::setStats(int*, bool)’ [-fpermissive]
void DudeWithStats::setStats(int* sts, bool drvd = false) {
^
c.cpp:10:14: error: after previous specification in ‘void DudeWithStats::setStats(int*, bool)’ [-fpermissive]
void setStats(int* stats, bool derived = false);
^
默认参数只给出一次,如果将其从定义中删除,就不会有问题
c.cpp: In member function ‘void DudeWithStats::setStats(int*, bool)’:
c.cpp:23:23: error: incompatible types in assignment of ‘int*’ to ‘int [5]’
derived.stats = sts;
^
c.cpp:25:20: error: incompatible types in assignment of ‘int*’ to ‘int [8]’
base.stats = sts;
^
谁说你的数组是可分配的?有memcpy
和new(&base.stats)
出于某种原因,不是吗
c.cpp: In function ‘int main()’:
c.cpp:34:13: error: request for member ‘setStats’ in ‘example’, which is of non-class type ‘DudeWithStats()’
example.setStats(arrBase);
^
c.cpp:35:13: error: request for member ‘setStats’ in ‘example’, which is of non-class type ‘DudeWithStats()’
example.setStats(arrDerived, true);
教程欺骗了你!你不是在声明一个变量,而是一个函数!
P> > C++语法(至少从程序员的角度来看)有一个模糊不清的地方,例如“代码> DuDEFISSTATS示例”()code>的意思是“声明一个不带参数的函数(在其他地方定义),并返回一个DudeWithStats
”,而不是“声明一个名为example
的DudeWithStats
,并默认初始化它”
对于后面的目的,使用dudestats示例代码>(带无括号!)。而且,对于勇敢和符合标准的灵魂来说,C++11支持在DudeWithStats示例{}中找到的这种不含糊的替代语法代码>。这种语法确实避免了上面提到的歧义,包括解决(甚至更多)困惑
所以答案是。。。
除了这些小细节,您的代码和模板的使用是(语法上)正确的P.D:请您使用size\u t
而不是unsigned const int
来改善每个人的心理健康,好吗?关于模板的内容,您完全正确。模板(可能太)灵活,系统(IMHO)只能由Haskell比较
无论如何,GCC不会喜欢您的代码:
c.cpp:21:57: error: default argument given for parameter 2 of ‘void DudeWithStats::setStats(int*, bool)’ [-fpermissive]
void DudeWithStats::setStats(int* sts, bool drvd = false) {
^
c.cpp:10:14: error: after previous specification in ‘void DudeWithStats::setStats(int*, bool)’ [-fpermissive]
void setStats(int* stats, bool derived = false);
^
默认参数只给出一次,如果将其从定义中删除,就不会有问题
c.cpp: In member function ‘void DudeWithStats::setStats(int*, bool)’:
c.cpp:23:23: error: incompatible types in assignment of ‘int*’ to ‘int [5]’
derived.stats = sts;
^
c.cpp:25:20: error: incompatible types in assignment of ‘int*’ to ‘int [8]’
base.stats = sts;
^
谁说你的数组是可分配的?有memcpy
和new(&base.stats)
出于某种原因,不是吗
c.cpp: In function ‘int main()’:
c.cpp:34:13: error: request for member ‘setStats’ in ‘example’, which is of non-class type ‘DudeWithStats()’
example.setStats(arrBase);
^
c.cpp:35:13: error: request for member ‘setStats’ in ‘example’, which is of non-class type ‘DudeWithStats()’
example.setStats(arrDerived, true);
教程欺骗了你!你不是在声明一个变量,而是一个函数!
P> > C++语法(至少从程序员的角度来看)有一个模糊不清的地方,例如“代码> DuDEFISSTATS示例”()code>的意思是“声明一个不带参数的函数(在其他地方定义),并返回一个DudeWithStats
”,而不是“声明一个名为example
的DudeWithStats
,并默认初始化它”
对于后面的目的,使用dudestats示例代码>(带无括号!)。而且,对于勇敢和符合标准的灵魂来说,C++11支持在DudeWithStats示例{}中找到的这种不含糊的替代语法代码>。这种语法确实避免了上面提到的歧义,包括解决(甚至更多)困惑
所以答案是。。。
除了这些小细节,您的代码和模板的使用是(语法上)正确的P.D:为了每个人的心理健康,请使用size\u t
而不是unsigned const int
好吗。是的,你可以
template <size_t N>
void foo()
{
// 100% standard-compliant and fine
bool array[N] = {};
}
模板
void foo()
{
//100%符合标准且良好
布尔数组[N]={};
}
是。是的,你可以
template <size_t N>
void foo()
{
// 100% standard-compliant and fine
bool array[N] = {};
}
模板
void foo()
{
//100%符合标准且良好
布尔数组[N]={};
}
尝试时发生了什么?模板参数的类型可能应该是size\t
如果没有其他错误,它将正常工作。通常情况下,这些数组都是不同类型的,这会很快让人恼火。但是如果这不是一个问题,那么这种方法是可以的代码>数组不可分配。如果使用std::array stats
然后可以使用赋值运算符复制数组。尝试该操作时发生了什么?模板参数的类型可能应该是size\t
,如果没有其他错误,它将正常工作。只是我经常