类构造函数问题中的简单变量模板 我是一个C++初学者,尝试用STL无序的映射作为成员变量来实现课程类,以存储学生的成绩。p> #include <iostream> using namespace std; class Course{ string course_name; Supervisor PI; Teacher TA; unordered_map<Student, int> grades; public: Course(string name, void get_student_grade(Student person){ return grades. ; } void printGrades(){ return ; } }; class Student{ string name; public: Student(string namee):name(namee){} }; int main(){ Course calculus{"calculus", Student Matt("Matt"), Student James("James"), Student Michelle("Michelle"), Student Ashley("Ashley"), Student Karen("Karen")}; calculus.printGrades(); }

类构造函数问题中的简单变量模板 我是一个C++初学者,尝试用STL无序的映射作为成员变量来实现课程类,以存储学生的成绩。p> #include <iostream> using namespace std; class Course{ string course_name; Supervisor PI; Teacher TA; unordered_map<Student, int> grades; public: Course(string name, void get_student_grade(Student person){ return grades. ; } void printGrades(){ return ; } }; class Student{ string name; public: Student(string namee):name(namee){} }; int main(){ Course calculus{"calculus", Student Matt("Matt"), Student James("James"), Student Michelle("Michelle"), Student Ashley("Ashley"), Student Karen("Karen")}; calculus.printGrades(); },c++,constructor,variadic-templates,C++,Constructor,Variadic Templates,,哈希表将搜索字符串James,然后返回值 谢谢你的帮助 只有在不需要同质列表的情况下(或在某些罕见的情况下,必须移动类型时),才应使用可变模板。在您的情况下,std::initializer\u list就足够了 这里有两种方法(注意创建课程时缺少的花括号)。在一个类中使用这两个实现是个坏主意,这只是为了演示 class Course { std::string course_name; std::unordered_map<Student, int> grades;

,哈希表将搜索字符串James,然后返回值


谢谢你的帮助

只有在不需要同质列表的情况下(或在某些罕见的情况下,必须移动类型时),才应使用可变模板。在您的情况下,
std::initializer\u list
就足够了

这里有两种方法(注意创建课程时缺少的花括号)。在一个类中使用这两个实现是个坏主意,这只是为了演示

class Course {
  std::string course_name;
  std::unordered_map<Student, int> grades;

 public:
  Course(std::string name, std::initializer_list<Student> students) {
    for (const auto& s : students) grades[s] = 0;
  }

  template <typename... Students>
  Course(std::string, Students&&... students) {
    ((grades[std::forward<Students>(students)] = 0), ...);
  }
};

int main() { 
  Course initializer{"calculus", {Student{"Matt"}, Student{"James"}}}; 
  Course variadic{"calculus", Student{"Matt"}, Student{"James"}};
}

请注意,为了方便起见,我将
名称
公开。

看起来您需要一个新的名称。或者模板大小的数组,但这有点复杂。您需要为
Student
类型提供哈希函数,以便将其用作
std::unordered_map
中的键。最好将分数移动到
Student
对象中,并使用simple
std::vector
@Nelfeal我应该如何使用初始值设定项列表来启用课程构造函数上的任意参数?在
课程
构造函数定义后是否缺少一些代码?这里有大量的语法错误。对于初学者来说,可变模板可能相当复杂-如果你首先学习如何传递函数参数(你做得不对),然后继续学习更高级的主题,你可能会更好。你在用哪本书?
class Course {
  std::string course_name;
  std::unordered_map<Student, int> grades;

 public:
  Course(std::string name, std::initializer_list<Student> students) {
    for (const auto& s : students) grades[s] = 0;
  }

  template <typename... Students>
  Course(std::string, Students&&... students) {
    ((grades[std::forward<Students>(students)] = 0), ...);
  }
};

int main() { 
  Course initializer{"calculus", {Student{"Matt"}, Student{"James"}}}; 
  Course variadic{"calculus", Student{"Matt"}, Student{"James"}};
}
class Student {
 public:
  Student(std::string namee) : name(namee) {}
  bool operator==(const Student& other) const { return name == other.name; }
  std::string name;
};

namespace std {
template <>
struct hash<Student> {
  size_t operator()(const Student& s) const {
    return std::hash<std::string>()(s.name);
  }
};
}  // namespace std