0

我有一个形式的构造:

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。

4

1 回答 1

2

您可能会遇到编译时错误,因为T*&&不是一个完美的转发工具。只是T&&。所以你的ptr参数只接受 rvalues。除此之外,你std::forward<T&&>应该是std::forward<T*>,但当然现在你有另一个错误无论如何这无关紧要。除此之外调用do_something_with_them未命中以达到do_something_with_them零参数的基本情况,因为 ifargs是空的......

如果你真的只想接受指针,你可以使用enable_ifand is_sameor is_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也有同样的问题,即不通用。

于 2012-02-05T11:54:12.310 回答