C++ 我可以在构建新的可变模板参数时使用一个可变模板参数吗?

C++ 我可以在构建新的可变模板参数时使用一个可变模板参数吗?,c++,c++11,variadic-templates,C++,C++11,Variadic Templates,我正在编写一个提升程序,它应该将一个变量arity函数提升到一些类似于带索引的SQL表的std::vector中。我想将f参数应用于所有向量中具有相同id的每一组元素。我在模板推导方面遇到了一个问题,我在这里提取了它(减去迭代器逻辑)。我已经写了我认为是合理的递归案例,但模板演绎认为它不可行 // Simple container type template <typename T> struct A { T x; T y; T z; }; // Wrapper typ

我正在编写一个提升程序,它应该将一个变量arity函数提升到一些类似于带索引的SQL表的std::vector中。我想将f参数应用于所有向量中具有相同id的每一组元素。我在模板推导方面遇到了一个问题,我在这里提取了它(减去迭代器逻辑)。我已经写了我认为是合理的递归案例,但模板演绎认为它不可行

// Simple container type
template <typename T>
struct A {
  T x;
  T y;
  T z;
};

// Wrapper type to differentiate an extracted value from a container
// in template deduction
template <typename T>
struct B {
  T value;
};

// Base case. All A<Ts> have been extracted to B<Ts>.
template <typename F, typename... Ts>
void lift (F f, B<Ts> ...bs) {
  // Call f with extracted values
  f(bs.value...);
}

// Recursive case
template <typename F, typename T, typename... Ts, typename Us>
void lift (F f, A<T> a, A<Ts> ...as, B<Us> ...bs) {
  // Copy a value from the beheaded container A<T>.
  B<T> b = {a.x};
  // Append this B<T> to args and continue beheading A<Ts>.
  lift(f, as..., bs..., b);
}

// Test function
template <typename... Ts>
struct Test {
  void operator () (Ts...) {}
};

int main () {

  B<int> b = {1};
  // No errors for the base case
  lift(Test<>());
  lift(Test<int, int>(), b, b);

  // error: no matching function for call to 'lift'
  // The notes refer to the recursive case
  A<int> a = {1,0,0};
  lift(Test<int>(), a); // note: requires at least 3 arguments, but 2 were provided
  lift(Test<int>(), a, a); // note: requires 2 arguments, but 3 were provided
  lift(Test<int>(), a, a, b); // note: requires 2 arguments, but 4 were provided
}
//简单容器类型
模板
结构A{
tx;
T y;
tz;
};
//包装器类型,用于区分从容器提取的值
//模板内演绎
模板
结构B{
T值;
};
//基本情况。所有A已提取到B。
模板
空隙提升(F、B、bs){
//使用提取的值调用f
f(英国标准值…);
}
//递归案例
模板
无效提升(F、A、A…as、B…bs){
//从斩首容器a复制一个值。
B={a.x};
//将此B附加到args并继续斩首A。
升降机(f,as…,bs…,b);
}
//测试功能
模板
结构测试{
void运算符()(Ts…){}
};
int main(){
B={1};
//基本情况下没有错误
提升(测试());
提升(测试(),b,b);
//错误:调用“lift”时没有匹配的函数
//注释涉及递归案例
A={1,0,0};
lift(Test(),a);//注意:至少需要3个参数,但提供了2个
lift(Test(),a,a);//注意:需要2个参数,但提供了3个
lift(Test(),a,a,b);//注意:需要2个参数,但提供了4个
}
这个代码怎么了


忽略这里的所有内容都是通过值传递的,以便于阅读和书写。为什么不编译呢?

为什么不直接提取A和B的值呢

template <typename T>
T extractValue(A<T> a)
{
    return a.x;
}
template <typename T>
T extractValue(B<T> b)
{
    return b.value;
}

template <typename F, typename... T>
void lift (F f, T... values) {
    f(extractValue(values)...);
}
模板
提取值(A)
{
返回a.x;
}
模板
提取值(B)
{
返回b.value;
}
模板
空隙提升(F,T…值){
f(提取值);
}
另外,您的最后两个测试用例无法编译,因为参数的数量是错误的

lift(Test<int,int>(), a, a);
lift(Test<int,int,int>(), a, a, b);
提升(测试(),a,a);
提升(测试(),a,a,b);

为什么参数的数量是错误的?当可变模板函数的目的是为可变模板函数提供错误数量的参数时,如何为可变模板函数提供错误数量的参数?我不明白。我不能提取这个值,因为我在每个容器中都有一个迭代器,一个迭代器可能前进几次,而其他迭代器可能在调用f之间只前进一次。我需要为每个迭代器分别处理此逻辑,因此我确实认为我需要折叠和列表内置参数。@SamuelDanielson:
Test()
只能接受1个参数。您已给出多个值。@SamuelDanielson:无法提取值→ 我不明白。请在问题中显示真实代码。
as
包不可推断,因为它不在最后一个参数位置。