【问题标题】:Is it possible to expand non-variadic arguments in a variadic template function?是否可以在可变参数模板函数中扩展非可变参数?
【发布时间】:2018-05-21 14:03:18
【问题描述】:

通过一个例子来解释我的意思可能更容易。想象以下模板:

template <class... Args>
std::tuple<Args...> foo();

它可以被调用,例如,像这样:

auto ret = foo<int, bool>();

但是如果我想根据可变参数模板参数的数量向函数传递额外的参数怎么办?例如,假设我想为每个 Args 传递一个字符串文字:

auto ret = foo<int, bool>("a", "b");

这样做的问题是,似乎无法扩展非可变参数,因此以下显然无法编译:

template <class... Args>
std::tuple<Args...> foo(const char*... names);

有什么合理的方法可以实现吗?

【问题讨论】:

  • 参加std::tuple?
  • 在这种情况下不需要元组,因为所有类型都是相同的类型。我可以使用 initializer_list,但问题是关于一个参数。
  • 你仍然可以使用可变参数模板,而不是使用静态断言来确保这些参数是允许的类型。

标签: c++ c++11 templates


【解决方案1】:

你可以这样做

template <class... Args>
std::tuple<Args...> foo(proxy<Args, const char*>... names);

proxy 在哪里

template<class T, class E>
using proxy = E;

你可以在这里看到这个:https://godbolt.org/g/SHBYzy

【讨论】:

  • 非常优雅的解决方案。根本不需要检查来确保列表具有相同数量的元素。 +1
猜你喜欢
  • 2023-03-07
  • 2014-04-12
  • 2014-10-30
  • 2013-10-03
  • 2015-05-21
  • 1970-01-01
  • 2016-12-01
  • 1970-01-01
相关资源
最近更新 更多