如何区分/分离模板功能的两个连续可变参数模板参数包?

问题描述 投票:1回答:2
template<class... Ts, class... Ps>
void Fun(Ts... ts, Ps... ps){};

Fun(1,'a',"blah", 2.13, 3.14f); 
// how do we separate which part is for ts or ps params pack

是否有一种方法可以明确注释参数的哪一部分属于ts / ps可变参数?

c++ templates variadic
2个回答
1
投票

不,可变参数模板包是贪婪的,不能将它们放在一起。

您可以将您的包包装成元组,然后以这种方式传递。

#include <tuple>

template<class... Ts, class... Ps>
void Fun(std::tuple<Ts...> ts, std::tuple<Ps...> ps) {
    // Do something with the tuples
}

int main()
{
   Fun(std::make_tuple(1,'a',"blah"), std::make_tuple(2.13, 3.14f)); 
}

0
投票

我们如何区分用于ts或ps params包的那一部分

更直接的方法是将函数重写为2个元组。

但是请注意,您已经可以拆分两个参数包。

Ts是不可推论的,而Ps则采用所有剩余的推论,因此,通过显式提供Ts参数,可以拆分它们:

Fun(1, 'a', "blah", 2.13, 3.14f);            // Ts: []; Ps: [int, char, const char*, double, float]
Fun<int, char>(1, 'a', "blah", 2.13, 3.14f); // Ts: [int, char]; Ps: [const char*, double, float]

Demo

© www.soinside.com 2019 - 2024. All rights reserved.