这给了我一个错误,就像我不能在std :: is_floating_point中使用一样,因为我不是常数。
int main() {
/* Enter your code here. Read input from STDIN. Print output to STDOUT */
int k=18;
int prime=0, nonprime=0;
int N=100;
int i=1, z=0, a=0, b=0;
int req = 1;
for(i=2; i<=N; i++){
if(std::is_floating_point<i/10>){
for(z=1; z<=i; z++){
if((i/z) == i){
if((i/z) == 0){
prime=prime+1;
}else{
nonprime=nonprime+1;
}
答案 0 :(得分:0)
在
if(std::is_floating_point<i/10>)
i
的值在编译时是未知的,因此不能用于扩展模板。
接下来,正如@AdnanY指出的那样,is_floating_point
模板期望一个类型不是数字。您可以将表达式转换为decltype
,
if(std::is_floating_point<decltype(i/10)>::value)
这也解决了我不是编译时常量的问题。 i
的值不是常数,但其类型是。请注意那里的::value
。展开模板后,您需要::value
才能获得结果bool
。
最后一点,i/10
一直是整数除法,所以结果保证是一个整数。 if
将始终测试为false并跳过正文。
以下是一些示例代码:
#include <iostream>
#include <type_traits>
int main() {
for (int i=1; i < 1000; i++)
std::cout << std::boolalpha
<< std::is_floating_point<decltype(i/10)>::value
<< '\n';
}
您可以将循环的上限设置为您想要的任何内容,并且您永远不会得到任何错误。
答案 1 :(得分:0)
如果您坚持使用template
,则必须制作compile-time loop
轮:
这是c ++ 11的一个很好的参考(减少了难度):https://www.codeproject.com/Articles/857354/Compile-Time-Loops-with-Cplusplus-Creating-a-Gener
然后,欢迎来到黑魔法:)