我需要创建一个通用的对象载体类。我想到了一些简单的东西,比如
template<typename T>
class ObjectCarrier
{
public:
const T& item() const
{
return item_;
}
void setItem(T& item)
{
item_ = item;
}
private:
T item_;
};
这在 T
时效果很好有一个默认构造函数(无参数)。当 T
时,事情变得复杂了有参数化的构造函数。所以我重写了类
template<typename T>
class ObjectCarrier
{
public:
const T& item() const
{
return *item_;
}
void setItem(T& item)
{
item_ = new T ( item );
}
private:
T* item_;
};
更改了 item_
变量为 T*
并使用 T
的复制构造函数创建了一个新实例.在 T
之前,这同样有效是指针类型。我是说 ObjectCarrier<Foo*>
不会工作。
我想知道如何设计这个类,使其适用于几乎所有类型。我想我可能需要创建一个 traits
专门用于指针的类型。但不幸的是,我无法完成这项工作。
任何帮助都会很棒。
最佳答案
上述方法太复杂了。保持简单,只需使用模板构造函数解决构造函数 arg 问题。不要使用指针,它们会导致对象生命周期和复制问题。
这是我经常使用的一个实现。模板构造函数会将事物的参数直接转发到嵌套对象上,这很方便。运算符 T& values 让你传递 carrier<T>
到采用类型 T 的函数,无需昂贵的复制。您可以使用此代码包装最多接受两个参数的对象。
/* A wrapper of type T */
template <typename T>
struct carrier {
carrier() {}
template <typename A1> carrier(const A1& a1) : value(a1) {}
template <typename A1, typename A2> carrier(const A1& a1, const A2& a2) : value(a1, a2) {}
operator T&() { return value; }
operator const T&() const { return value; }
T value;
};
你可以这样使用它:
const carrier<point> p1(10,10); // make p1 const to stop people changing it
showPoint(p1); // calls a function that expects a point,
showPoint(p1.value); // access the point directly
关于c++ - 通用对象载体类 - C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1695425/