可变参数调度功能

我有一个接口,其中参数的类型大多编码其自身的含义。我有一个采用这些参数之一的函数。我正在尝试制作一个函数,该函数需要一组这些参数并按顺序对每个参数执行该函数。
#include <iostream>
#include <vector>

enum param_type{typeA,typeB};

template <param_type PT> struct Container{
  int value;
  Container(int v):value(v){}
};

int f(Container<typeA> param){
  std::cout<<"Got typeA with value "<<param.value<<std::endl;
  return param.value;
}
int f(Container<typeB> param){
  std::cout<<"Got typeB with value "<<param.value<<std::endl;
  return param.value;
}

我当前的解决方案使用递归可变参数模板来委派工作。

void g(){}
template <typename T,typename...R>
void g(T param,R...rest){
  f(param);
  g(rest...);
}

我想使用压缩的参数扩展,但是如果不使用返回值,我似乎无法使其工作。 (在我特定的情况下,这些功能是无效的。)

template <typename...T> // TODO: Use concepts once they exist.
void h(T... params){
  // f(params);...
  // f(params)...;    // Fail to compile.
  // {f(params)...};
  std::vector<int> v={f(params)...}; // Works
}

示例用法

int main(){
  auto a=Container<typeA>(5);
  auto b=Container<typeB>(10);
  g(a,b);
  h(a,b);
  return 0;
}

在C ++中进行这种扩展是否有优雅的语法?

caoxueqiang2009 回答:可变参数调度功能

在C ++ 17中:使用fold表达式和逗号运算符。

template <typename... Args>
void g(Args... args)
{
    ((void)f(args),...);
}

在C ++ 17之前:用0逗号,然后扩展到int数组的大括号初始化列表中。多余的0可以确保不创建大小为零的数组。

template <typename... Args>
void g(Args... args)
{
    int arr[] {0,((void)f(args),0)...};
    (void)arr;                            // suppress unused variable warning
}

在两种情况下,函数调用表达式都强制转换为void,以避免意外调用用户定义的operator,

本文链接:https://www.f2er.com/3162026.html

大家都在问