首页 > 解决方案 > C++ 元组类型到函数参数类型

问题描述

假设我有一个函数应该接受应该匹配元组类型的参数,我可以这样写:

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)
{
}

但这实际上与真正拥有intfloat作为参数不同,它采用所有类型的参数,然后将它们限制为只允许匹配类型。我如何能够以函数实际上将类型ArgsTuple作为参数的方式解包元组,以便例如 Visual Studio 能够自动完成调用函数所需的类型。结果函数必须是自由函数。

标签: c++tuplesvariadic-templatessfinae

解决方案


不确定你想要什么,而不是完全免费的函数(而是模板类中的静态方法),但我想你要求类似如下的东西

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);

推荐阅读