2017-04-11 46 views
2

我正在(重新)为这个库设计一个API。并且有这个函数将采用任何数量的模板化参数。我可以将其定义为:在设计可变模板API时,我应该更喜欢使用元组还是参数包?

template<typename... Ts>  
void foo(bar_t bar, Ts... params); 

,或者为:

template<typename... Ts>  
void foo(bar_t bar, std::tuple<Ts...> params); 

我知道这两个是可互换的(在两个方向):

C++11: I can go from multiple args to tuple, but can I go from tuple to multiple args?

所以两种选择都一样,但是 - 我应该更喜欢一种变体,还是仅仅是品味/个人风格?

+1

我会说,直到一个异构初始化列表'{t1,t2,t3,...}'可以传递给'std :: tuple 的类型* * T1,T2 ...'(现在不是该语言的一部分)的推导*,第一个选项更普遍(但其他原因不方便)。他们的方式是当前的语言,第二个选项*强制调用者了解显式的'std :: tuple <...>'或者'std :: make_tuple'函数。 – alfC

回答

1
  1. 元组方法在呼叫方很难。例如,转发需要用户使用不同的tuple定义或forward_as_tuple。相比之下,可变参数的转发仅仅是函数接口的问题,仅此而已。来电者甚至不必知道它。

  2. 对于许多用途,元组方法在实现者方面比较困难。拆开参数包的包装比拆开包装tuple容易得多。虽然参数包数量有限,但它们比tuple更具灵活性。

  3. 元组方法允许调用链接。没有可变返回值这样的事情,并且当结构化绑定接近时,您不能将多个返回值推送到函数的多个参数中。相比之下,使用元组和元组的返回值,可以将调用从一个函数链接到另一个函数。

因此,如果调用链是什么,很可能到了很多事给你,然后一个元组接口可能是适当的。否则,这只是一小撮收益而已。

相关问题