变量模板值的递归计算

时间:2018-11-04 06:41:51

标签: c++ templates c++14 c++17

这就是我要打结(失败)的原因。这个想法是package multipleEmployeeData; import java.util.Scanner; public class MultipleEmployeeData extends EmployeeDetail{ static EmployeeDetail[] emp=null; public static void empDataoutput() { System.out.println("Employee Database: "); System.out.println("EmployeeName"+"\t"+"EmployeeNumber"+"\t"+"EmployeeSalary"+"\t"+"EmployeeMobileNumber"); for(int i=0;i<3;i++ ) { System.out.print(emp[i].EmpName+"\t"+emp[i].EmpNumber+"\t"+emp[i].Salary+"\t"+emp[i].MobNumber); System.out.println(); } } public static void main(String[] args) { // TODO Auto-generated method stub Scanner scn=new Scanner(System.in); emp=new EmployeeDetail[3]; for(int i=0;i<3;i++) { System.out.println("Enter the employee "+(i+1)+" name"); emp[i].EmpName=scn.nextLine(); System.out.println("Enter the employee "+(i+1)+" number"); emp[i].EmpNumber=Integer.parseInt(scn.nextLine()); System.out.println("Enter the employee "+(i+1)+" Mobile number"); emp[i].MobNumber=Long.parseLong(scn.nextLine()); System.out.println("Enter the employee "+(i+1)+" Salary"); emp[i].Salary=Float.parseFloat(scn.nextLine()); } scn.close(); empDataoutput(); } } class EmployeeDetail{ String EmpName; int EmpNumber; Float Salary; Long MobNumber; } 必须等于count<N>。这是更复杂的计算的简化案例,不要介意这段代码的明显愚蠢。

N

无法编译:

template <>
constexpr size_t count<0> = 0;

template <auto N>
constexpr size_t count = 1 + count<static_cast<size_t>(N) - 1>;

int main()
{
    return count<1>;
}

如果我将一般情况与专业化互换,那么它也不会编译。甚至可以使用变量模板吗?

Try it online

1 个答案:

答案 0 :(得分:9)

以下是正确的代码版本:

template <auto N>
constexpr size_t count = 1 + count<static_cast<size_t>(N) - 1>;

template <>
constexpr size_t count<static_cast<size_t>(0)> = 0;

观察以下内容:

  1. 必须在指定任何专业名称之前声明主模板。没有例外。
  2. 专业化count<0>count<static_cast<size_t>(0)>不同,因为它们的参数具有不同的类型。在原始代码中,在其中提供了显式专门化count<0>的情况下,如在主模板定义中指定的,在count<1>中发生的递归未使用该专门化,这就是发生无限递归的原因。 / li>