我正在学习C ++。我有一个Classroom类,它应该以某种方式运行,具体取决于正在使用的Configuration对象。我可以在创建Classroom对象时在构造函数中传递Configuration对象:
class Classroom {
private:
Configuration conf;
public:
Classroom(Configuration conf_){
conf = conf_;
}
/** more member functions that use conf **/
};
但我觉得如果我可以使用模板会更酷。创建Classroom对象时,Configuration对象将作为模板参数传递。这就是我提出的,但它不起作用:
template<Configuration &conf>
class Classroom {
int doSomething(int n){
// member function that uses data in Configuration object
return n + conf.config_1;
}
};
struct Configuration {
public:
int config_1;
};
int main() {
Configuration conf;
conf.config_1 = 95;
Classroom<conf> myClassroom;// doesn't work
}
它说:错误:'conf'的值在常量表达式中不可用。
我错过了什么?
答案 0 :(得分:2)
你可以通过一些限制来做到这一点。您尝试这样做的方式无效。这是一个存储问题。
如果您需要多个配置,可以将其定义为类模板的静态成员,或者定义Configuration
的全局数组:
struct Configuration {
int config_1;
};
template<int>
struct Accessor {
static Configuration configuration;
};
template<int N>
Configuration Accessor<N>::configuration;
template<Configuration &conf>
class Classroom {
int doSomething(int n){
return n + conf.config_1;
}
};
int main() {
Accessor<1>::configuration.config_1 = 95;
Classroom<Accessor<1>::configuration> myClassroom;
(void)myClassroom;
}
如果您可以坚持使用单个实例,您甚至可以将其放在全局范围内并使用它:
struct Configuration {
int config_1;
};
Configuration conf;
template<Configuration &conf>
struct Classroom {
int doSomething(int n){
return n + conf.config_1;
}
};
int main() {
conf.config_1 = 95;
Classroom<conf> myClassroom;
myClassroom.doSomething(42);
}
其他解决方案是可行的,但我相信你明白了。
答案 1 :(得分:0)
模板参数应该是类型或至少是一组在编译时已知的文字或枚举值。
所以你不能这样做。
你可以做的就是
template<typename ConfType>
class Classroom {
const ConfType& conf_;
public:
// Provide a constructor that takes a reference to the Configuration type
Classroom(const ConfType& conf) : conf_(conf) {}
int doSomething(int n){
// member function that uses data in Configuration object
return n + conf.config_1;
}
};
struct Configuration {
public:
int config_1;
};
int main() {
Configuration conf;
conf.config_1 = 95;
Classroom<Configuration> myClassroom(conf);
}