Переадресация аргументов - PullRequest
       26

Переадресация аргументов

0 голосов
/ 05 февраля 2012

У меня есть конструкция в форме:

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 Ответ

2 голосов
/ 05 февраля 2012

Скорее всего, вы получите ошибки во время компиляции, потому что T*&& - это , а не - идеальное средство пересылки.Только T&& есть.Таким образом, ваш ptr параметр принимает только значения .И в дополнение к этому, ваш std::forward<T&&> должен быть std::forward<T*>, но, конечно, теперь, когда у вас есть другая ошибка, это не имеет значения.И в дополнение к , что вызов do_something_with_them пропускает базовый случай do_something_with_them с нулевыми параметрами, потому что если args пусто ...

Если вы действительнотолько хотите принимать указатели, вы можете работать с enable_if и is_same или 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 имеет ту же проблему, что и не является универсальным.

...