Jon*_*an. 4 c++ templates template-specialization template-meta-programming
我需要能够在变量中存储模板的任何特化,例如:
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;
}
Run Code Online (Sandbox Code Playgroud)
它会更容易做到:
Foo* foo;
Grid* grid;
switch wants {
case NUMBERS:
grid = foo->aBunchOfNumbers;
break;
case STRINGS:
grid = foo->aBunchOfStrings;
break;
}
std::cout << "Rows: " << grid->GetRows() << std::endl;
std::cout << "Col0 is: " << grid->GetTypeofColumn(0) << std::endl;
//...etc...
Run Code Online (Sandbox Code Playgroud)
以同样的方式,如果我使用这样的子类:http://ideone.com/MPKy1w
我知道类模板几乎基本上是宏以及编译器实际如何编译它们,但是没有办法一般地引用特化并节省重复吗?
(我在这里故意使用指针,我在实际代码中别无选择,我无法在这里复制)
使用所需方法创建类("接口").可以这样做是因为您的方法不依赖于模板参数T:
class GridOperations {
virtual int GetRows() = 0;
virtual int getTypeOfColumn(int col) = 0;
virtual ~GridOperations() {}
};
Run Code Online (Sandbox Code Playgroud)
现在从上面的类继承Grid:
template<T>
class Grid : public GridOperations {
int GetRows() { /* impl */ }
int GetTypeOfColumn(int col) { /* impl */ }
};
Run Code Online (Sandbox Code Playgroud)
现在你可以施放都Grid<int>*和Grid<string>*到GridOperations*:
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;
Run Code Online (Sandbox Code Playgroud)
额外奖励:您甚至可以使用std::map<WantEnumType, GridOperations*>以避免令人讨厌的开关块.
| 归档时间: |
|
| 查看次数: |
124 次 |
| 最近记录: |