4

我有一个模板类,它有很多功能,但本质上是一个向量类。我想为 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 定义它。

4

4 回答 4

12

您可以像这样在类模板中定义它

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>()); }
};

如果你调用which一个你没有给出正确定义reflected<T>的对象,这会产生一个编译时错误。T

于 2010-11-11T21:32:52.163 回答
4

如果只想添加一个问题,可以将继承与特化结合起来:

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>&);
于 2010-11-11T21:29:43.217 回答
1

不能按照你想要的方式直接完成。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;
}
于 2010-11-11T21:31:37.307 回答
0

您可以添加vector<ar_index> reflected<bool>::which()reflected<bool>(并且仅添加到它,而不是添加到通用模板)。如果你得到一个错误,也许你没有正确地做模板专业化......

于 2010-11-11T21:36:07.757 回答