在设计可变参数模板API时,我是否更喜欢使用元组或参数包?

时间:2017-04-11 13:28:30

标签: c++11 variadic-templates api-design idiomatic stdtuple

我(重新)为这个库设计了一个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 个答案:

答案 0 :(得分:1)

  1. 在调用者方面,元组方法更难。例如,转发要求用户使用不同的tuple定义或forward_as_tuple。相比之下,转换为可变参数的情况是你的函数接口的问题,仅此而已。来电者甚至不必了解它。

  2. 对于许多用途,实现者方面的元组方法更难。解包参数包比解包tuple要容易得多。虽然参数包有限,但它们比tuple开箱即用更灵活。

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

  4. 因此,如果调用链接对您来说很重要,那么元组接口可能是合适的。否则,这只是一个很小的实际收益的行李。