Типы кортежей C ++ для типов параметров функций - PullRequest
0 голосов
/ 26 февраля 2019

Допустим, у меня есть функция, которая должна принимать аргументы, которые должны соответствовать типам кортежа, я мог бы написать это так:

using ArgsTuple = std::tuple<int, float>;

template<typename... Args, 
    class = typename std::enable_if<std::is_convertible<std::tuple<Args...>, ArgsTuple>::value>::type>
void function(Args... args)
{
}

Но на самом деле это отличается от того, что на самом деле intи float в качестве параметров, он принимает все типы параметров и затем ограничивает их, чтобы разрешить только совпадающие типы.Как бы я мог распаковать кортеж таким образом, чтобы функция фактически имела типы в ArgsTuple в качестве параметров, чтобы, например, Visual Studio могла автоматически заполнять типы, необходимые для вызова функции.Полученная функция должна быть свободной функцией.

1 Ответ

0 голосов
/ 26 февраля 2019

Не уверен, что понимаю, что вы хотите, и не совсем бесплатную функцию (но статический метод в классе шаблона), но я предполагаю, что вы запрашиваете что-то похожее, как показано ниже

template <typename>
struct proFunc;

template <template <typename ...> class C, typename ... Ts>
struct proFunc<C<Ts...>>
 {
   static void func (Ts ...)
    { }
 };

что вы можете использовать этот способ

using ArgsTuple = std::tuple<int, float>;

proFunc<ArgsTuple>::func(1, 2.f);

и вы также можете проверить, что

static_assert( std::is_same<decltype(&proFunc<ArgsTuple>::func),
                            void(*)(int, float)>::value, "!" );

Чтобы получить что-то более похожее на бесплатную функцию, вы можете использовать указатели на функции

auto  funcPnt = &proFunc<ArgsTuple>::func;

funcPnt(3, 4.f);
...