簡體   English   中英

C ++:調用模板化類的非模板化函數

[英]C++: call non-templated functions of a templated class

是否可以在模板化類中具有可調用的非模板化函數? 像這樣:

template<typename T>
class Object
{
public:
  static int loadInfo() { return 0;}
  // more code
};

我想寫,例如:

Object::loadInfo();

代替

Object<int8_t>::loadInfo();

它實際上並不重要,而只是一些“語法糖”。 背景知識:我正在考慮的功能將從磁盤上加載一些數據,程序在該數據上決定必須使用的對象的模板版本。 ATM看起來像這樣:

auto usewhat=Object<char>::loadInfo();   // this line feels so wrong
if(usewhat == 0) {
  Object<int8_t> o;
  o.doSomething();
}else if(usewhat == 1){
  Object<int32_t> o;
  o.doSomething();
}else{
  Object<int64_t> o;
  o.doSomething();
}

我能想到的atm的唯一可能性是1)使用不同名稱的非模板基類(例如,“ BaseObject”)或2)使用其他名稱不同的類(例如,“ InfoObject”)...但是兩種可能性似乎都不太吸引人。

您應該使loadInfo成為一個自由函數(可以使用不同的名稱(例如loadObjectInfo或任何有意義的方式來指示與Object的語義關系)。

即使它是static函數並且不依賴於Object的特定實例,它仍然依賴於Object的模板參數:該函數可以使用T ,即使在您的情況下顯然不使用T 這意味着編譯器將為每個具有不同TObject<T>::loadInfo生成新代碼,這意味着生成速度較慢,並且二進制文件可能更大。 同樣,您不能在cpp文件中實現該功能。

如果您有可用的Scott Meyers的Effective C ++(第3版)的副本,則可能要查找項目44(“模板中與因子參數無關的代碼”)。

不直接,但您可以使用typedef

typdef Object<int8_t> MyObject;
MyObject::loadInfo();

如果該函數可以移出該類,請執行此操作。

如果不能將其移出班級,但不依賴於T,則您的班級太胖了,應該拆分。

class ObjectBase {
  // stuff that doesn't depend on T
  static int loadInfo();
};

template <typename T>
class Object : public ObjectBase {
  // more stuff
};

實際上,我認為沒有指定模板就沒有可移植的方式來調用模板類的函數。 我還建議盡可能保持代碼的可移植性,因為這可能會在將來對您有所幫助(使用其他編譯器以及您當前使用的其他版本的編譯器)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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