[英]Templated member functions cannot call non-templated member function from same class, 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
這意味着編譯器將為每個具有不同T
的Object<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.