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() { ... }

但是someNumberanotherNumber都不是具体的数字,所以需要做模板参数:

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 时无法推断其类型。所以你需要:

  1. 为两个模板参数分配一些具体值:
template <int numInstances>
class myClassContainer{
    myClass<2, 3> *myClassInstances[numInstances];
};
  1. 可以使用myClassContainer的模板参数来计算一个值:
myClass<numInstances, numInstances * 2> *myClassInstances[numInstances];
  1. 或者你可以将它们都设为模板参数,然后将它们添加到 class 模板参数中:
template <int numInstances, int A, int B>
class myClassContainer{
    myClass<A, B> *myClassInstances[numInstances];
};
  1. 当然你可以混合使用它们

请注意,无论您决定采用哪种方法,都不能将 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)
{ ... }