如何使用对象实例作为模板参数?

时间:2017-08-26 19:56:04

标签: c++ templates

我正在学习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'的值在常量表达式中不可用。

我错过了什么?

2 个答案:

答案 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);
}

其他解决方案是可行的,但我相信你明白了。

请参阅wandbox上的示例uprunning

答案 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);
}