在C++中有一种很好的方法来实现(或伪造)一个通用矢量向量的类型吗?
忽略向量向量是一个好主意的问题(除非有等价的东西总是更好).假设它确实对问题进行了精确建模,并且矩阵不能准确地模拟问题.假设将这些事物作为参数的模板化函数确实需要操纵结构(例如调用push_back),因此它们不能仅仅采用泛型类型支持[][].
我想做的是:
template<typename T>
typedef vector< vector<T> > vecvec;
vecvec<int> intSequences;
vecvec<string> stringSequences;
Run Code Online (Sandbox Code Playgroud)
但当然这是不可能的,因为typedef不能模板化.
#define vecvec(T) vector< vector<T> >
Run Code Online (Sandbox Code Playgroud)
很接近,并且可以保存在vecvecs上运行的每个模板化函数中复制类型,但不会受到大多数C++程序员的欢迎.
Joh*_*itb 51
你想拥有template-typedef.这是不被支持在当前的C++.解决方法是做
template<typename T>
struct vecvec {
typedef std::vector< std::vector<T> > type;
};
int main() {
vecvec<int>::type intSequences;
vecvec<std::string>::type stringSequences;
}
Run Code Online (Sandbox Code Playgroud)
在接下来的C++中(由于2010年称为c ++ 0x,c ++ 1x),这将是可能的:
template<typename T>
using vecvec = std::vector< std::vector<T> >;
Run Code Online (Sandbox Code Playgroud)
您可以简单地创建一个新模板:
#include <string>
#include <vector>
template<typename T>
struct vecvec : public std::vector< std::vector<T> > {};
int main()
{
vecvec<int> intSequences;
vecvec<std::string> stringSequences;
}
Run Code Online (Sandbox Code Playgroud)
如果你这样做,你必须记住向量的析构函数不是虚拟的,并且不要做这样的事情:
void test()
{
std::vector< std::vector<int> >* pvv = new vecvec<int>;
delete pvv;
}
Run Code Online (Sandbox Code Playgroud)