D G*_*cia 9 c++ templates partial-specialization
我有一个容器类,我们称之为
template <class T> CVector { ... }
Run Code Online (Sandbox Code Playgroud)
当T是指针类型时,我想对这个类做一些不同的事情,例如:
template <class T*> CVector< SomeWrapperClass<T> >;
Run Code Online (Sandbox Code Playgroud)
SomeWrapperClass期望指向的东西的类型作为其参数.不幸的是,这种语法不太适用,并且通过一些挖掘,我还没有找到一种很好的方法来获得这样的工作.
为什么这样?我想在一个非常大的应用程序中更改我们的一些容器如何工作,当他们专门的类型是指针而非指针 - 理想情况下,我想这样做而不改变〜1,000个地方在代码中有像CVector<Object*>vs CVector<int>或某些东西这样的东西- 并且玩具有局部特化的游戏似乎是要走的路.
我在这里破解吗?
如果我理解正确,这可能会做你想要的:
template<typename T>
class CVector { ... };
template<typename T>
class CVector<T*> : public CVector< SomeWrapperClass<T> > {
public:
// for all constructors:
CVector(...) : CVector< SomeWrapperClass<T> >(...) {
}
};
Run Code Online (Sandbox Code Playgroud)
它增加了一个额外的继承层来欺骗CVector<T*>成为一个CVector< SomeWrapperClass<T> >.如果您需要添加其他方法以确保预期接口T*和所提供接口之间的完全兼容性,这可能也很有用SomeWrapperClass<T>.
这在C++中运行得很好......
#include <iostream>
template <class T>
class CVector
{
public:
void test() { std::cout << "Not wrapped!\n"; }
};
template <class T>
class CVector<T*>
{
public:
void test() { std::cout << "Wrapped!\n"; }
};
int main()
{
CVector<int> i;
CVector<double> d;
CVector<int*> pi;
CVector<double*> pd;
i.test();
d.test();
pi.test();
pd.test();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
28733 次 |
| 最近记录: |