[英]Specializing a template class member function for only one type
我有一个模板类,它有很多功能,但本质上是一个矢量类。 我想为bool类型添加一个函数。
#include <vector>
template <typename T>
class reflected{
private:
T*dev_;
T*host_;
ar_size size;
reflected<T>& operator=(reflected<T>& rhs);//do not impliment. assign not allowed.
reflected( reflected<T>& old); //do not impliment. Copy not allowed.
public:
reflected():size(0L),dev_(NULL),host_(NULL){}
reflected(ar_size n):size(n),dev_(NULL),host_(NULL){init();}
reflected(const T*x,ar_size n):size(n),dev_(NULL),host_(NULL){init();set(x);}
~reflected();
void init();
void init(ar_size n);
void init(const T*x,ar_size n);
void set(const T * x);
void setat(ar_index i, T x);
const T getat(ar_size i);
const T * devPtr();
const T operator [](const ar_index i);
ar_size length(){return size;}
};
我想在反射类的特殊情况下添加一个函数vector<ar_index> reflected<bool>::which()
,这是唯一有意义的情况。 做这个的最好方式是什么。 编译器似乎不喜欢添加which()来反映并仅为bool定义它。
您可以在类模板中定义它
template <typename T> struct id { typedef T type; };
template <typename T>
class reflected{
private:
/* ... */
vector<ar_index> which(id<bool>) {
/* ... */
}
public:
/* ... */
vector<ar_index> which() { return which(id<T>()); }
};
如果您在reflected<T>
上调用which
T
您没有给出正确的定义,则会产生编译时错误。
如果您只想添加一个问题,可以将继承与专业化结合起来:
template <typename T>
class reflected_base {
// your current 'reflected' contents go here
};
template <typename T>
class reflected : public reflected_base { };
template <>
class reflected<bool> : public reflected_base {
vector<ar_index> which();
};
这种方法的缺点是你必须为每个专业化重新实现某些操作(析构函数,复制构造函数等)。 另一种选择是:
template <typename T>
class specialized_reflected { };
template <>
class specialized_reflected<bool> {
public:
vector<ar_index> which();
};
template <typename T>
class reflected : public specialized_reflected<T> {
// your current 'reflected' contents go here
};
但是,依赖名称查找存在潜在问题。 第三个选项(可能是我选择的选项)是使用非成员函数:
vector<ar_index> which(reflected<bool>&);
不能以你想要的方式直接完成。 但是你可以通过不为任何类定义reflected()
来实现类似的结果,除了专门的类。 如果您尝试在不受支持的类上使用它,则会出现线性错误。
#include <string>
#include <sstream>
using namespace std;
template<typename A>
class Gizmo
{
public:
Gizmo(){};
int which();
};
template<> int Gizmo<bool>::which()
{
return 42;
}
int main()
{
Gizmo<bool> gb;
gb.which();
Gizmo<int> gi;
gi.which(); // LINKER ERROR for Gizmo<int>which()
return 0;
}
您可以将vector<ar_index> reflected<bool>::which()
到reflected<bool>
(仅限于它,而不是通用模板)。 如果您收到错误,也许您没有正确地进行模板专业化...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.