C++ C++;保存类模板的任何专门化的变量

C++ C++;保存类模板的任何专门化的变量,c++,templates,template-meta-programming,template-specialization,C++,Templates,Template Meta Programming,Template Specialization,我需要能够在变量中存储模板的任何专门化,例如: template<T> class Grid { int GetRows(); int GetTypeOfColumn(int col); //...etc... } //EDIT: Grid<int>::GetTypeofColumn(int col) { return col == 0 ? STRING_COL_TYPE : INT_COL_TYPE; } Grid<string>::Ge

我需要能够在变量中存储模板的任何专门化,例如:

template<T>
class Grid {
  int GetRows();
  int GetTypeOfColumn(int col);
  //...etc...
}

//EDIT:
Grid<int>::GetTypeofColumn(int col) {
   return col == 0 ? STRING_COL_TYPE : INT_COL_TYPE;
}
Grid<string>::GetTypeofColumn(int col) {
   return STRING_COL_TYPE;
}
//End EDIT

class Foo {
  Grid<int>* aBunchOfNumbers;
  Grid<string>* aBunchOfStrings;
  //...etc...
}

//in some function, say `wants` is an enum, and foo is gotten from somewhere:
Foo* foo; 
switch wants {
  case NUMBERS:
    std::cout << "Rows: " << foo->aBunchOfNumbers->GetRows() << std::endl;
    std::cout << "Col0 is: " << foo->aBunchOfNumbers->GetTypeofColumn(0) << std::endl;
    //...etc...
    break;
  case STRINGS:
    std::cout << "Rows: " << foo->aBunchOfNumbers->GetRows() << std::endl;
    std::cout << "Col0 is: " << foo->aBunchOfNumbers->GetTypeofColumn(0) << std::endl;
    //...etc...
    break;
}
模板
类网格{
int GetRows();
int-GetTypeOfColumn(int-col);
//……等等。。。
}
//编辑:
Grid::GetTypeofColumn(int列){
返回列==0?字符串列类型:INT列类型;
}
Grid::GetTypeofColumn(int列){
返回字符串\列\类型;
}
//结束编辑
福班{
网格*相邻的数字;
网格*邻接字符串;
//……等等。。。
}
//在某些函数中,假设'wants'是一个枚举,而foo是从某处获得的:
Foo*Foo;
交换需要{
案件编号:

std::cout GetRows()使用所需的方法(“接口”)创建类。之所以可以这样做,是因为您的方法不依赖于模板参数
T

class GridOperations {
    virtual int GetRows() = 0;
    virtual int getTypeOfColumn(int col) = 0;
    virtual ~GridOperations() {}
};
现在从上面的类继承网格:

template<T>
class Grid : public GridOperations {
  int GetRows() { /* impl */ }
  int GetTypeOfColumn(int col) { /* impl */ }
};

好处:您甚至可以使用
std::map
来避免讨厌的开关阻塞。

您需要一些多态性。有静态(重载、模板)和动态(虚拟函数)。只需选择一个。但对于多态性,他不需要为他想要包含的每个新类定义一个派生类吗?@Stephen不需要使用Templates,但GetTypeOfColumn实现的内容取决于模板中的类型
t
。@Stephen不需要,如果模板本身是从多态性基础派生的。谢谢,关于方法,该方法具有类型为T的参数,例如,
GetValue(T*obj)
,该参数在同样采用类型T的函数中调用?在这种情况下,您可以将
someMemberFunction
声明为函数模板:。其思想是,如果您的类/函数依赖于smth.templated,则它(类/函数)还必须模板化。您还必须了解,从编译器的角度来看,
Grid
Grid
是两个不同的类(如Robot、PricingPolicy和GreenException)。模板是创建类似函数和类的族的方法,以避免分别编写它们。
template<T>
class Grid : public GridOperations {
  int GetRows() { /* impl */ }
  int GetTypeOfColumn(int col) { /* impl */ }
};
Foo* foo;
GridOperations* ops;
switch wants {
  case NUMBERS:
    ops = foo->aBunchOfNumbers;
    break;
  case STRINGS:
    ops = foo->aBunchOfStrings;
    break;
}
std::cout << "Rows: " << ops->GetRows() << std::endl;
std::cout << "Col0 is: " << ops->GetTypeofColumn(0) << std::endl;