c++ - 将构造函数参数传递给模板函数工厂

标签 c++ templates

我有这个功能:

template <class T> 
T *allocate()
{
    T *obj = new(top) T();
    top += sizeof(T);
    return obj;
}

现在,使用默认构造函数创建对象效果很好,但是如何创建需要传递新参数的对象?

我知道它可以使用 C++11 的可变参数 template 来实现,但是如果没有 C++11 功能我怎么能做到这一点呢? (显然我的 VS2012 版本还不支持此功能,但我想知道如何在没有此功能的情况下执行此操作,即使升级会修复它)

最佳答案

没有一种语言功能可以取代可变参数模板(当然,否则它们就不会被发明出来)。

您可以提供多个重载,最多接受 N参数(为了合理选择 N )。每个重载都会将其参数完美转发给 T 的构造函数.

所以除了你的空函数模板:

template <class T>
T *allocate()
{
    T *obj = new(top) T();
    top += sizeof(T);
    return obj;
}

您将拥有一个一元函数模板:

template <class T, class P1>
T *allocate(P1&& p1)
{
    T *obj = new(top) T(std::forward<P1>(p1));
    top += sizeof(T);
    return obj;
}

二元函数模板:

template <class T, class P1, class P2>
T *allocate(P1&& p1, P2&& p2)
{
    T *obj = new(top) T(std::forward<P1>(p1), std::forward<P2>(p2));
    top += sizeof(T);
    return obj;
}

三元函数模板:

template <class T, class P1, class P2, class P3>
T *allocate(P1&& p1, P2&& p2, P3&& p3)
{
    T *obj = new(top) T(std::forward<P1>(p1), std::forward<P2>(p2), 
                        std::forward<P3>(p3));
    top += sizeof(T);
    return obj;
}

等等(你明白了)。如果您介意代码复制,您可以找出一些可以减轻痛苦的宏 - 但它们并不能消除它,尤其是在您不喜欢宏的情况下。

不要忘记:

#include <utility>

访问 std::forward<>() .

关于c++ - 将构造函数参数传递给模板函数工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17090796/

相关文章:

c++ - 通过比较扩展类型

c++ - 为什么 std::function 不参与重载决策?

c++ - 可变参数模板的声明点

c++ - 使用 move 语义优化二进制算术运算

c++ - For循环,检查相同的对

c++ - 用于 GL_SHADER_STORAGE_BUFFER 的 glGetBufferSubData 和 glMapBufferRange 在 NVIDIA GTX960M 上非常慢

c++ - 模板特化子类

c++ - 如何在 C++ 中实现公式模式?

html - 如何使用包装器将 CSS 文件应用于我的 Catalyst webapp 中的特定模板

C++ 数组包装器