模板类以及非模板版本或空模板

时间:2014-06-30 09:05:07

标签: c++ templates

我正在尝试设计一个工作者和一个任务类,并且在纠正它时遇到了一些麻烦。我实施的基本设计是

class Result{
    void isComplete()
    void cancel()
    ...
}

class Task{
    Result Submit()
    ...
}

我想创建一个这样的版本,我也可以在结果中返回一个对象。像这样,

template<typename T>
class Result : Result{
    T* GetResult();
}

template<typename T>
class Task : Task {
    void SetResult(T* result);
}

实现这一目标的最佳方法是什么?我正在考虑使用void作为默认参数创建一个类,但我不确定void是否可以作为参数传递给方法。

1 个答案:

答案 0 :(得分:1)

你是对的,void不能“作为参数传递”。但是,在您的情况下,您将指向T的指针作为参数传递,因此它将是void*,这是一个有效的参数类型。但是如果没有结果对象,那么将一个void指针指向任何东西的方法仍然没有多大意义。因此,您可以专门设计void的模板,并删除该案例的方法,例如:像这样:

template<typename T>
class Task : public TaskBase {
  void SetResult(T* result);
  // other methods
};

template <>
class Task<void> : public TaskBase {
  //only the other methods
};

请注意,您将难以尝试实现模板类Task和具有相同名称的nontemplate类。编译器将无法区分这些名称。