C ++元组类型转换为参数类型

时间:2019-02-26 13:17:03

标签: c++ tuples variadic-templates sfinae

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

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能够自动完成调用函数所需的类型。结果函数必须是自由函数。

1 个答案:

答案 0 :(得分:2)

不确定要知道什么,也不完全是自由函数(而是模板类中的静态方法),但是我想您正在要求类似以下内容

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