Оболочка Variadic-функции с учетом ссылок и констант - PullRequest
0 голосов
/ 14 сентября 2018

Я создал небольшой пример функции-оболочки. Я хочу, чтобы обертка учитывала, использует ли вызываемая функция (const) ссылки, то есть выходные данные будут 4/5, а не 4/4, но я не хочу принудительно использовать использование ссылок, если упакованная функция не используйте их.

#include <iostream>
#include <string>

struct a {
  static void run(int cref) {
    cref = 5;
  };
};

struct b {
  static void run(int &cref) {
    cref = 5;
  };
};

template <class FTor>
struct foo {
    template <class ... Args>
    static void wrapper(Args ... args) {
      FTor::run(args ...);
    }
};


int main()
{
    int bar = 4;
    foo<a>::wrapper(bar);
    std::cout << bar;

    foo<b>::wrapper(bar);
    std::cout << bar;
}

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

А как насчет использования совершенной пересылки?

template <class FTor>
struct foo {
    template <class ... Args>
    static void wrapper(Args && ... args) {
      FTor::run(std::forward<Args>(args) ...);
    }
};

Таким образом, независимо от того, какая квалификация ref, имеющаяся на входе, передается во внутреннюю функцию.

0 голосов
/ 14 сентября 2018

Это попытка ответить на то, что, возможно, является моим неправильным толкованием в отношении запроса OP, поскольку простая совершенная пересылка решает описанный сценарий, не прибегая к выводу типов аргументов в виде упакованной функции.

Исходный ответ: По крайней мере для ограниченного варианта использования, такого как вы, вы можете использовать структуру черты малого типа, чтобы вывести тип одиночного аргумента , передаваемого wrapper()из типа аргумента функтора:

#include <iostream>
#include <string>

struct a {
  static void run(int cref) {
    cref = 5;
  };
};

struct b {
  static void run(int &cref) {
    cref = 5;
  };
};

template <typename>
struct ArgType;

template <typename R, typename A>
struct ArgType<R(A)>
{ using type = A; };

template <class FTor>
struct foo {
    static void wrapper(typename ArgType<decltype(FTor::run)>::type args) {
      FTor::run(args);
    }
};

int main()
{
    int bar = 4;
    foo<a>::wrapper(bar);
    std::cout << bar;

    foo<b>::wrapper(bar);
    std::cout << bar;
}

Вывод:

45

Обратите внимание, что это не будет поддерживать совершенную пересылку из оболочки, как wrapper() здесь сам по себе не является частью * контекста вывода типа - в отличие от вашего фрагмента, который выводит, но не основывается на том, что вы хотите, чтобы он выводил.Надеюсь, я найду время, чтобы добавить обобщенное решение для variadic шаблона функции, такого как в вашем фрагменте, perfect forwarding включается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...