2017-08-26 20 views
3

我正在學習C++。我有一個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

模板實例化由編譯器完成。因此,在編譯時應該知道你作爲模板參數傳遞的內容 –

+0

缺少關鍵字'typename或class'。 – Raindrop7

+5

_「但是我認爲如果我可以使用它的模板會更酷。」_不要做那些事,因爲你認爲它們是_cool_。在第一個地方有一個合理的用例。 – user0042

回答

1

你可以做,有一些限制。你試圖做到這一點的方式是無效的。這是一個存儲問題。

如果你需要一個以上的配置身邊,你可以將它定義爲一個類模板的靜態成員或定義的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); 
} 

其他的解決方案是可能的,但我敢肯定,你上心。


見例子uprunning上wandbox。

1

模板參數意味着是編譯時已知的類型或至少是一組有限的文字或枚舉值。

所以你不能這樣做。


什麼可以做,雖然是一樣的東西

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); 
} 
+0

[你知道...](https://wandbox.org/permlink/2LTZEOWI2Ns1jMwl)。 – skypjack

+0

你甚至可以有[多個配置](https://wandbox.org/permlink/jg0jDSEqQPW0jqf8),仍然可以。 – skypjack

相關問題