gpt4 book ai didi

c++ - 模板重新声明中的模板参数过多

转载 作者:搜寻专家 更新时间:2023-10-31 00:30:56 25 4
gpt4 key购买 nike

.

你好:-)

我有以下代码:目标是大致返回一个函数,该函数是其他函数的总和。并了解可变参数模板。

#include <iostream>

template <typename F>
struct FSum {
FSum(F f) : f_(f) {} ;
int operator()() {
return f_() ;
}
F f_ ;
} ;
template <typename F1, typename F2, typename... Frest>
struct FSum {
FSum(F1 f1, F2 f2, Frest... frest) {
f_ = f1 ;
frest_ = FSum<F2, Frest...>(f2, frest...) ;
}
int operator()() {
return f_() + frest_() ;
}
F1 f_ ;
FSum<F2, Frest...> frest_ ;
} ;

struct F1 {
int operator() () { return 1 ; } ;
} ;
struct F2 {
int operator() () { return 2 ; } ;
} ;
struct F3 {
int operator() () { return 3 ; } ;
} ;

int main() {
F1 f1 ;
F2 f2 ;
F3 f3 ;
FSum<F1, F2, F3> fsum = FSum<F1, F2, F3>(f1, f2, f3) ;
std::cout << fsum() << std::endl ;
}

但是我从 clang 得到了以下错误信息(g++ 也给出了一个错误):

test_variadic.cpp:14:1: error: too many template parameters in template redeclaration template ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

好吧,我不明白。我虽然编译器会根据模板参数的数量选择类?由于第一个正好有一个,而另一个有 2 个或更多。

有什么想法吗?

非常感谢:-)

最佳答案

编译器报错是因为您两次重新声明相同的模板结构,而您需要的是部分模板特化。请参阅下面示例中的语法。

至于让可变参数模板执行您想要的操作的逻辑,从递归的角度来考虑它会有所帮助。以下代码可以满足您的需求:

#include <iostream>

using namespace std;

// stops "recursion" when it is called with no parameters
template <typename... Frest> struct FSum {
int operator()() {
return 0;
}
};

// Partial Specialization of FSum above
// called when there is at least one template parameter
template <typename F, typename... Frest>
struct FSum<F, Frest...> {

// "recursion" in the construction of frest_
FSum(F f, Frest... frest) : f_(f), frest_(frest...) {}

// "recursion" in the calling of frest()
int operator()() {
return f_() + frest_();
}

F f_;
FSum<Frest...> frest_;
};


struct F1 {
int operator()() { return 1; }
};

struct F2 {
int operator()() { return 2; }
};

struct F3 {
int operator()() { return 3; }
};

int main() {
F1 f1;
F2 f2;
F3 f3;
FSum<F1, F2, F3> fsum(f1, f2, f3);
cout << fsum() << endl;
}

请注意,我使用了“递归”一词,但据我了解,递归并不存在。相反,在编译时会生成一系列函数调用。

关于c++ - 模板重新声明中的模板参数过多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35283056/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com