Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板类以及非模板或空模板版本_C++_Templates - Fatal编程技术网

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

C++ 模板类以及非模板或空模板版本,c++,templates,C++,Templates,我正试图设计一个工人和一个任务类,但在正确使用时遇到了一些困难。我实现的基本设计是 class Result{ void isComplete() void cancel() ... } class Task{ Result Submit() ... } 我想创建一个版本的这些,我也可以返回一个对象的结果。像这样, template<typename T> class Result : Result{ T* GetResult();

我正试图设计一个工人和一个任务类,但在正确使用时遇到了一些困难。我实现的基本设计是

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);
}
模板
班级成绩:成绩{
T*GetResult();
}
模板
班级任务:任务{
无效设置结果(T*结果);
}

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

您是对的,
void
不能作为参数传递。但是,在本例中,您传递一个指向
T
的指针作为参数,因此它将是
void*
,这是一种有效的参数类型。但如果没有结果对象,那么让一个空指针指向nothing的方法仍然没有多大意义。因此,您可以专门化
void
的模板,并摆脱这种情况下的方法,例如:

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

template <>
class Task<void> : public TaskBase {
  //only the other methods
};
模板
类任务:公共任务库{
无效设置结果(T*结果);
//其他方法
};
模板
类任务:公共任务库{
//只有其他方法
};

请注意,尝试实现具有相同名称的模板类任务和非模板类时会遇到困难。编译器将无法区分这些名称。

@Bathsheba I可能会返回一个唯一的\u ptr,因为调用方将拥有内存。一旦“任务”完成,它就不再拥有内存
void
实际上在C//C++中有点矛盾,因为它可能表示空类型,但因此不能按原样将其用于参数类型。Otoh,它可能用于
void*
,即指向某个未识别类型的指针。模板中的使用取决于类型在内部的使用方式:如果在模板中使用
T*
,例如,您可以将
T
绑定到
void
,因为生成的类型是合法的。也就是说,我认为您的设计没有任何重大问题。您可能希望从C++11中获得灵感。