如何在可变参数模板函数中访问参数

时间:2019-05-27 01:44:29

标签: c++ function c++11 parameters variadic-templates

在C / C ++中执行可变参数功能的旧方法是使用cstdarg中定义的va_list,va_start,va_arg,va_end。 C ++ 11带有可变参数函数模板语法,但是如何访问值?

//example
#include <iostream>
using namespace std;

template <typename... types>
void print(types... Params){
  //this is not working:
  long Param1 = Params[0];
  long Param2 = Params[1];
}

int main(){
  print(123, 456);
  print(123, "foobar");
}

2 个答案:

答案 0 :(得分:1)

这是一种非常简单(不破坏性)的方法,尽管可能不是最佳方法:

bb

https://godbolt.org/z/V8VA0W

如果所有元素都属于同一类型(并假设您可以复制它们):

; with 
Tab1 as
(
    select  val  = '2:21,5:50,4:55,7:80,9:33'
)
select  t.*, k1.k, k2.k, k3.k, k4.k, k5.k
from    Tab1 t
    cross apply
    (
        select  i = charindex(',', t.val),
            k = substring(t.val, 1, charindex(',', t.val + ',', 1) - 1)
    ) k1
    cross apply
    (
        select  i = charindex(',', t.val, k1.i + 1),
            k = substring(t.val, k1.i + 1, charindex(',', t.val + ',', k1.i + 1) - k1.i - 1)
    ) k2
    cross apply
    (
        select  i = charindex(',', t.val, k2.i + 1),
            k = substring(t.val, k2.i + 1, charindex(',', t.val + ',', k2.i + 1) - k2.i - 1)
    ) k3
    cross apply
    (
        select  i = charindex(',', t.val, k3.i + 1),
            k = substring(t.val, k3.i + 1, charindex(',', t.val + ',', k3.i + 1) - k3.i - 1)
    ) k4
    cross apply
    (
        select  i = charindex(',', t.val, k4.i + 1),
            k = substring(t.val, k4.i + 1, charindex(',', t.val + ',', k4.i + 1) - k4.i - 1)
    ) k5

问题尚不清楚,但是看起来您想打印列表中的所有元素,如果您只想执行此操作,则可以按照以下步骤进行操作(需要C ++ 17,但是您可以在c ++ 11中的一些工作):

#include <iostream>
#include<tuple>
#include<cassert>

using namespace std;

template <typename... types>
void print(types... Params){
  long Param1 = std::get<0>(std::tie(Params...));
  long Param2 = std::get<1>(std::tie(Params...));
  assert(Param1 == 123 and Param2 == 456);
}
int main(){
  print(123, 456);
}

答案 1 :(得分:0)

有一个使用运算符的解决方案<<此处:https://stackoverflow.com/a/5495309/5581893

但这实际上不是单个函数调用,而是对operator <<的一系列调用,并且该函数不能在全局范围内,它必须是某种类型的方法。