簡體   English   中英

創建將模板類作為構造函數中的參數的模板類

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM