C++ class 具有多个参数的模板
C++ class templates with multiple arguments
我刚开始学习如何在c++中使用模板,我有点吃力。我在下面有一个例子,在我挂断电话的地方有评论。
#include <iostream>
using namespace std;
template<int arrayOneSize, int arrayTwoSize>
class myClass{
public:
myClass(){
for(int i = 0; i < arrayOneSize; i++){
arrayOne[i] = i;
}
for(int i = 0; i < arrayTwoSize; i++){
arrayTwo[i] = i;
}
}
int arrayOne[arrayOneSize];
int arrayTwo[arrayTwoSize];
void printArrayElements(){
for(int i = 0; i < arrayOneSize; i++){
cout << arrayOne[i] << '\n';
}
for(int i = 0; i < arrayTwoSize; i++){
cout << arrayTwo[i] << '\n';
}
}
void someOtherFunction();
};
// can't figure out how to define constructors or functions outside of class
void myClass::someOtherFunction(){
}
template <int numInstances>
class myClassContainer{
public:
myClassContainer(){
for(int i = 0; i < numInstances; i++){
myClassInstances[i] = NULL;
}
}
// this doesn't work
template<int, int> myClass<int, int> *myClassInstances[numInstances];
// also doesn't work
void addClassInstance(myClass *instance){
for(int i = 0; i < numInstances; i++){
if(myClassInstances[i] == NULL){
myClassInstances[i] = instance;
}
}
}
void printAll(){
for(int i = 0; i < numInstances; i++){
myClassInstances[i]->printArrayElements();
}
}
};
int main()
{
myClass<5,6> myClass1;
myClass<1,4> myClass2;
myClassContainer<2> container;
container.addClassInstance(&myClass1);
container.addClassInstance(&myClass2);
container.printArrayElements();
return 0;
}
我希望能够将指向 myClass 实例的指针传递给 myClassContainer,但我无法理解模板语法。在此先感谢您的任何建议。
can't figure out how to define constructors or functions outside of class
void myClass::someOtherFunction(){}
这里的问题是没有class叫myClass
。相反,只有 classes 称为 myClass<someNumber, anotherNumber>
。所以,为了定义 someOtherFunction
,必须这样写:
void myClass<someNumber, anotherNumber>::someOtherFunction() { ... }
但是someNumber
和anotherNumber
都不是具体的数字,所以需要做模板参数:
template<int someNumber, int anotherNumber>
void myClass<someNumber, anotherNumber>::someOtherFunction() { ... }
另请注意,使用与 class 声明中使用的模板名称相同的模板名称更为常见和方便,因此您的定义将是:
template<int arrayOneSize, int arrayTwoSize>
void myClass<arrayOneSize, arrayTwoSize>::someOtherFunction() { ... }
this doesn't work
template<int, int> myClass<int, int> *myClassInstances[numInstances];
这里的问题是所有 class 成员的类型必须在定义 class 时已知。因此,您不能让成员的模板 class 在定义外部 class 时无法推断其类型。所以你需要:
- 为两个模板参数分配一些具体值:
template <int numInstances>
class myClassContainer{
myClass<2, 3> *myClassInstances[numInstances];
};
- 可以使用
myClassContainer
的模板参数来计算一个值:
myClass<numInstances, numInstances * 2> *myClassInstances[numInstances];
- 或者你可以将它们都设为模板参数,然后将它们添加到 class 模板参数中:
template <int numInstances, int A, int B>
class myClassContainer{
myClass<A, B> *myClassInstances[numInstances];
};
- 当然你可以混合使用它们
请注意,无论您决定采用哪种方法,都不能将 myClass<5, 6>
和 myClass<1, 4>
添加到同一数组,因为它们不是同一类型。
also doesn't work
void addClassInstance(myClass *instance)
再说一次,myClass
不是类型,它必须是 myClass<someValue, anotherValue>
。所以必须给函数加上模板参数:
template<int someValue, int anotherValue>
void addClassInstance(myClass<someValue, anotherValue *instance){ ... }
如果您想在 class 之外定义它:
template<int numInstances>
template<int someValue, int anotherValue>
void myClassContainer<numInstances>::addClassInstance(myClass<someValue, anotherValue> *instance)
{ ... }
我刚开始学习如何在c++中使用模板,我有点吃力。我在下面有一个例子,在我挂断电话的地方有评论。
#include <iostream>
using namespace std;
template<int arrayOneSize, int arrayTwoSize>
class myClass{
public:
myClass(){
for(int i = 0; i < arrayOneSize; i++){
arrayOne[i] = i;
}
for(int i = 0; i < arrayTwoSize; i++){
arrayTwo[i] = i;
}
}
int arrayOne[arrayOneSize];
int arrayTwo[arrayTwoSize];
void printArrayElements(){
for(int i = 0; i < arrayOneSize; i++){
cout << arrayOne[i] << '\n';
}
for(int i = 0; i < arrayTwoSize; i++){
cout << arrayTwo[i] << '\n';
}
}
void someOtherFunction();
};
// can't figure out how to define constructors or functions outside of class
void myClass::someOtherFunction(){
}
template <int numInstances>
class myClassContainer{
public:
myClassContainer(){
for(int i = 0; i < numInstances; i++){
myClassInstances[i] = NULL;
}
}
// this doesn't work
template<int, int> myClass<int, int> *myClassInstances[numInstances];
// also doesn't work
void addClassInstance(myClass *instance){
for(int i = 0; i < numInstances; i++){
if(myClassInstances[i] == NULL){
myClassInstances[i] = instance;
}
}
}
void printAll(){
for(int i = 0; i < numInstances; i++){
myClassInstances[i]->printArrayElements();
}
}
};
int main()
{
myClass<5,6> myClass1;
myClass<1,4> myClass2;
myClassContainer<2> container;
container.addClassInstance(&myClass1);
container.addClassInstance(&myClass2);
container.printArrayElements();
return 0;
}
我希望能够将指向 myClass 实例的指针传递给 myClassContainer,但我无法理解模板语法。在此先感谢您的任何建议。
can't figure out how to define constructors or functions outside of class
void myClass::someOtherFunction(){}
这里的问题是没有class叫myClass
。相反,只有 classes 称为 myClass<someNumber, anotherNumber>
。所以,为了定义 someOtherFunction
,必须这样写:
void myClass<someNumber, anotherNumber>::someOtherFunction() { ... }
但是someNumber
和anotherNumber
都不是具体的数字,所以需要做模板参数:
template<int someNumber, int anotherNumber>
void myClass<someNumber, anotherNumber>::someOtherFunction() { ... }
另请注意,使用与 class 声明中使用的模板名称相同的模板名称更为常见和方便,因此您的定义将是:
template<int arrayOneSize, int arrayTwoSize>
void myClass<arrayOneSize, arrayTwoSize>::someOtherFunction() { ... }
this doesn't work
template<int, int> myClass<int, int> *myClassInstances[numInstances];
这里的问题是所有 class 成员的类型必须在定义 class 时已知。因此,您不能让成员的模板 class 在定义外部 class 时无法推断其类型。所以你需要:
- 为两个模板参数分配一些具体值:
template <int numInstances>
class myClassContainer{
myClass<2, 3> *myClassInstances[numInstances];
};
- 可以使用
myClassContainer
的模板参数来计算一个值:
myClass<numInstances, numInstances * 2> *myClassInstances[numInstances];
- 或者你可以将它们都设为模板参数,然后将它们添加到 class 模板参数中:
template <int numInstances, int A, int B>
class myClassContainer{
myClass<A, B> *myClassInstances[numInstances];
};
- 当然你可以混合使用它们
请注意,无论您决定采用哪种方法,都不能将 myClass<5, 6>
和 myClass<1, 4>
添加到同一数组,因为它们不是同一类型。
also doesn't work
void addClassInstance(myClass *instance)
再说一次,myClass
不是类型,它必须是 myClass<someValue, anotherValue>
。所以必须给函数加上模板参数:
template<int someValue, int anotherValue>
void addClassInstance(myClass<someValue, anotherValue *instance){ ... }
如果您想在 class 之外定义它:
template<int numInstances>
template<int someValue, int anotherValue>
void myClassContainer<numInstances>::addClassInstance(myClass<someValue, anotherValue> *instance)
{ ... }