相等数量的模板和函数参数

时间:2018-06-09 21:20:03

标签: c++ templates c++14 variadic-templates

有没有办法生成模板化函数,其中有相同数量的模板参数和函数参数(相同类型)?

如下所示:

// template function:
template<typename ... Args>
void foo(const std::string& a, const std::string& b, ...) { /*...*/}

// example 1
foo<int>("one argument only");

// example 2
foo<int, double>("first argument", "second argument");

如果存在始终存在的默认函数参数(未模板化)(或多个),该怎么办?

template<typename ... Args>
void foo(int i /* as default */, const std::string& a,
                                 const std::string& b, ...)
 { /*...*/}

甚至可以让我们说出重复数量的函数参数(通过模板参数的大小计算)?

1 个答案:

答案 0 :(得分:10)

  

有没有办法生成模板化函数,其中有相同数量的模板参数和函数参数(相同类型)?

是的:它是(编辑:根据贾斯汀的建议简化;谢谢!)

#include <string>

template <typename, typename T>
using skip_first = T;

template <typename ... Args>
void foo (skip_first<Args, std::string> ... as)
 { }

int main()
 {
   foo<int>("one argument only");

   foo<int, double>("first argument", "second argument");
 }
  

如果有默认功能参数(或多个)怎么办?

template<typename ... Args>
void foo(int i /* as default */, const std::string& a,
                                 const std::string& b, ...)
 { /*...*/}

如果你想要一个(或多个)前面不同类型的参数,是的,这是可能的。

template <typename ... Args>
void foo (int i, long j, skip_first<Args, std::string> ... as)
 { }

如果您希望前面的参数具有默认值,则不能:因为参数的可变参数列表不能具有默认值,并且因为给定具有默认值的参数,所有以下参数都必须具有默认值参数。

  

甚至可以拥有,假设函数参数的重复数量(通过模板参数的大小计算)?

我想你可以繁殖(重复解压缩更多次)解压缩部分

template <typename ... Args>
void foo (skip_first<Args, std::string> ... as1,
          skip_first<Args, std::string> ... as2)
 { }

显然,只有当您想要将整数的模板参数数乘以时,此解决方案才有效。