转发论点

时间:2012-02-05 11:48:28

标签: c++ variadic-templates perfect-forwarding

我有一个表单构造:

template<class T>
    void do_something_with_it(T*&& ptr)
    {
//here I can do something with this ptr
    }

    template<class T,class... Args>
    void do_something_with_them(T*&& ptr, Args&&... args)
    {
        do_something_with_it(std::forward<T&&>(ptr));
        do_something_with_them(std::forward<Args&&>(args)...);
    }

但由于某种原因,我无法转发这些论点。有办法吗?
我正在使用gcc 4.6.1。

1 个答案:

答案 0 :(得分:2)

您可能会遇到编译时错误,因为T*&& 不是一个完美的转发工具。只有T&&。因此,您的ptr参数仅接受rvalues 。除此之外,您的std::forward<T&&>应该是std::forward<T*>,但当然现在您还有其他错误,这无关紧要。除 之外,对do_something_with_them的调用错过了do_something_with_them的基本情况,参数为零,因为如果args为空......

如果您真的只想接受指针,可以使用enable_ifis_sameis_convertible。但当然我不认为它已经“转发”了。

怎么样?
template<typename T, typename ...Args>
auto do_something_with_them(T&&t, Args&&...args)
  -> decltype(do_something_with_it(std::forward<T>(t)))
{ ... }

这样你让do_something_with_it决定它是否接受参数(如果你想要的话,你也可以将递归调用放入decltype。我把它作为练习留给读者这里可能需要什么操作员)。但当然do_something_with_it也有同样的问题,即不是通用的。