C ++:调用模板化类的非模板化函数

时间:2014-11-10 13:09:35

标签: c++ function class templates

在模板化的类中是否可以使用可调用的非模板化函数?像这样:

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”)。 ..但两种可能性似乎都不太吸引人。

4 个答案:

答案 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)

实际上我认为没有指定模板就没有可移植方法来调用模板类的功能。我还建议尽可能地保持代码的可移植性,因为它将来可能对你有所帮助(与你目前使用的其他版本编译器的其他编译器一样)。