我正在学习C++。我有一个 Classroom 类,它应该根据正在使用的配置对象以一种或另一种方式表现。创建 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”的值在常量表达式中不可用。
我缺少什么?
您可以这样做,但有一些限制。您尝试执行此操作的方式无效。这是一个存储问题。
如果需要多个配置,可以将其定义为类模板的静态成员或定义一个全局数组Configuration
s:
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);
}
其他解决方案也是可能的,但我相信您已经明白了。
查看示例up https://wandbox.org/permlink/2LTZEOWI2Ns1jMwl and running https://wandbox.org/permlink/jg0jDSEqQPW0jqf8在魔杖盒上。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)