c++ - 通用对象载体类 - C++

标签 c++ templates typetraits

我需要创建一个通用的对象载体类。我想到了一些简单的东西,比如

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/

相关文章:

c++ - 如何编写可以接受堆栈或队列的函数模板?

c++ - 右值的函数重载

c++ - 在 Qt 应用程序中获取命令行参数

c++ - 在 STL 映射和列表上迭代的通用循环 (c++)

c++ - 如果 std::vector 作为 T::Zero 存在,如何生成代码以使用自定义零值初始化 std::vector?

c++ - 异或数据包中的所有数据

未知类型的 C++ 模板参数

c++ - C++ 中的模板特化

c++ - fatal error : 'type_traits' file not found

c++ - 部分特化类型特征时如何使用 std::decay?