[英]Create template class which takes template class as argument in a constructor
我有一個由三層組成的代碼。 在最高級別上有一個大師班。 然后是一個Grid類,它知道Master,因為它將其功能用於一般任務。 在網格上,我可以創建字段,該字段將Grid作為其構造函數中的一個參數。 現在,我想制作網格和字段模板,以使它們能夠包含任意數據類型。
我無法讓Field正確處理已賦予Grid的類型。 原則上,他應該可以推斷出來。 我該如何工作? 當然,我的示例尚未編譯。
#include <vector>
class Master
{
public:
Master() {};
};
template<class T>
class Grid
{
public:
Grid(Master &masterin) : master(masterin) {};
private:
Master &master;
std::vector<T> data;
};
template<class T>
class Field
{
public:
Field(Master &masterin, Grid &gridin) : master(masterin), grid(gridin) {};
private:
Master &master;
Grid &grid;
std::vector<T> data;
};
int main()
{
Master master;
Grid<int> grid(master);
Field<double> field(master, grid);
return 0;
}
template<class T>
class Field
{
public:
Field(Master &, Grid &);
這是無效的,您不能傳遞Grid
類型的參數,因為Grid
不是類型
private:
Master &master;
Grid &grid;
您不能擁有Grid
類型的成員,因為它不是一個類型
您可以通過將其構造為模板來修復該構造函數:
template<typename U>
Field(Master &, Grid<U> &);
這將接受屬於Grid
模板的任何類型的任何類型,但是您仍然不能擁有模板的成員變量,您需要確定希望該成員成為哪種Grid
或將其存儲為靈活類型像boost::any
。
如果希望Field
能夠與任何類型的Grid
則需要另一個模板參數:
template<class T, class U>
class Field
{
public:
Field(Master&, Grid<U>&);
private:
Master& master;
Grid<U>& grid;
std::vector<T> data;
};
要推斷Grid<U>
的類型,可以定義一個生成器函數:
template<typename T, typename U>
Field<T, U>
make_field(Master& m, Grid<U>& g)
{ return Field<T, U>(m, g); }
Master master;
Grid<int> grid;
auto field = make_field<double>(master, grid); // returns Field<double, int>
但是,如果沒有C ++ 11的auto
關鍵字,則使用起來很不方便,實際上並沒有太大幫助,因為無論如何您必須拼出完整類型:
Field<double, int> field = make_field<double>(master, grid);
網格是模板,因此它必須具有模板參數才能在此處使用。 給定您的示例,似乎您希望Grid和Field具有獨立的類型。 這意味着必須使用兩個參數對Field進行模板化-一個參數用於其自身,一個參數用於與其一起使用的Grid。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.