【发布时间】:2016-04-25 16:28:53
【问题描述】:
我需要能够将模板的任何特化存储在变量中,例如:
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;
}
这样做会更容易:
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...
如果我使用这样的子类,同样的方式:http://ideone.com/MPKy1w
我知道类模板几乎基本上是宏以及编译器如何实际编译它们,但有没有办法泛指特化并节省重复?
(这里特意用了指针,我的实际代码没有选择,这里不能复制)
【问题讨论】:
-
你想要一些多态性。有静态(重载、模板)和动态(虚拟函数)。随便选一个。
-
但是有了多态性,他不是必须为他想要包含的每个新类定义一个派生类吗?
-
@Stephen 没有模板
-
但是 GetTypeOfColumn 的实现取决于模板中的
T类型? -
@Stephen 如果模板本身是从多态基派生的,则不是。
标签: c++ templates template-meta-programming template-specialization