指针作为模板参数?

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>或某些东西这样的东西- 并且玩具有局部特化的游戏似乎是要走的路.

我在这里破解吗?

sth*_*sth 7

如果我理解正确,这可能会做你想要的:

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>.


rlb*_*ond 5

这在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)


rme*_*dor 4

我不认为你可以使用你描述的语法来专门化一个类......我不知道这可能如何工作。您可以做的是专门化指针类,并使用原始指针周围的包装类重新实现其内部。我不确定这是否有帮助,但本文描述了指针的专用模板。