在模板化的类中是否可以使用可调用的非模板化函数?像这样:
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();
}
我能想到的唯一可能性是1)使用不同名称的非模板基类(比如“BaseObject”)或2)使用另一个具有不同名称的类(比如“InfoObject”)。 ..但两种可能性似乎都不太吸引人。
答案 0 :(得分:2)
你应该使loadInfo
成为一个自由函数(可能使用不同的名称,如loadObjectInfo
或任何有意义的函数来表示与Object
的语义关系。)
即使它是static
函数并且不依赖于Object
的特定实例,它仍然依赖于Object
的模板参数:该函数可能使用{{1即使在你的情况下它显然没有。这意味着编译器将为具有不同T
的每个Object<T>::loadInfo
生成新代码,这意味着较慢的构建和可能更大的二进制文件。此外,您无法在cpp文件中实现该功能。
如果您有Scott Meyers的Effective C ++(第3版)副本,您可能需要查找第44项(“模板中与因子参数无关的代码”)。
答案 1 :(得分:1)
不是直接,但您可以使用typedef
:
typdef Object<int8_t> MyObject;
MyObject::loadInfo();
答案 2 :(得分:1)
如果该功能可以移出课堂,请执行此操作。
如果它不能移出课堂,但不依赖于T,你的课程太胖了,应该分开。
class ObjectBase {
// stuff that doesn't depend on T
static int loadInfo();
};
template <typename T>
class Object : public ObjectBase {
// more stuff
};
答案 3 :(得分:0)
实际上我认为没有指定模板就没有可移植方法来调用模板类的功能。我还建议尽可能地保持代码的可移植性,因为它将来可能对你有所帮助(与你目前使用的其他版本编译器的其他编译器一样)。