2

假设我有一些名为 的模板类friendly_point和一个名为 的用户定义类foo,并且foo有一些具有不同 arg 编号和类型的构造函数,例如foo()foo(int)foo(int, char *)

我想知道是否有任何方法可以实现friendly_point模板,以便我可以编写这样的客户端代码:

friendly_point<foo> obj1;
friendly_point<foo> obj2(1);
friendly_point<foo> obj3(1,"abc");

更重要的是,friendly_point模板能否以这样一种方式实现,即它的用户可以将一些内存池连接到它,所以它提供给客户端的所有对象都来自该池?

4

2 回答 2

5

您已经可以做到这一点,只需子类化一个智能指针并像已经做的那样使用完美转发。示例emplace

#include <memory>
#include <utility>

template<class T>
struct friendly_ptr
{
    std::shared_ptr<T> p;
    template<typename... Params>
    friendly_ptr(Params&&... params) : p(new T(std::forward<Params>(params)...))
    {
    }

};

int main()
{
    friendly_ptr<int> p(1);
}
于 2013-03-29T02:34:52.473 回答
0

如 Mehrdad 所示,C++11 引入了转发。

在 C++03 中,您可以尝试使用模板 ala:

template <typename T>
class Wrapper
{
  public:
    Wrapper() { }

    template <typename T1>
    Wrapper(const T1& t1) : t_(t1) { }

    template <typename T1. typename T2>
    Wrapper(const T1& t1, const T2& t2) : t_(t1, t2) { }

    template <typename T1. typename T2, typename T3>
    Wrapper(const T1& t1, const T2& t2, const T3& t3) : t_(t1, t2, t3) { }
    ...

  private:
    T t_;
};

因为在调用函数之前不会检查所有错误,所以使用占位符来表示比T当前支持的更多的参数是可以的。

您可以使用预处理器宏为通常充足但不是疯狂数量的参数生成此类转发函数。您可能会或可能不会发现使用 boost 预处理器库更容易做到这一点。

虽然这在简单的情况下通常就足够了,但这并不是一个通用的解决方案。具体来说——当你想传递一个非const参数时。你可以:

  • const不在参数列表中,但非const引用不能绑定到临时对象,因此调用者不能在准备参数值时使用很多普通表达式,或者
  • 接受const引用然后抛弃const-ness,但这消除了语言的故意保护功能,并可能允许尝试更改真正的const变量,包括例如字符串文字 - 导致未定义的行为。
于 2013-03-29T04:49:36.743 回答