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中获得灵感。