注意:这是this.
的后续问题我有一组模板类,它们使用完全不同的数据类型以完全不同的方式完成不同的事情。但是,它们共享共同的方法名称。例如,Get()
,Set()
,Resize()
等是所讨论的每个类的有效方法。此外,他们以相同的顺序接受参数。这允许广义的非朋友,非成员函数在每个类上工作。一个简化的例子:
template <typename Class, typename Datatype>
void Insert(const Class<Datatype>& Object, const std::size_t Index, const Datatype Value)
{
Object.Resize(Object.Size() + 1);
for (std::size_t CurrentIndex = Object.Size() - 1; CurrentIndex > Index; CurrentIndex--)
{
Object.Set(CurrentIndex, Object.Get(CurrentIndex - 1));
}
Object.Set(Index, Value);
}
现在,我只是依靠自己的记忆来正确定义所有合适的方法。有没有办法让编译器强制执行正确方法的定义?如果没有,有更好的方法吗?
答案 0 :(得分:3)
编译器已经通过拒绝让您为不提供必要方法的类型实例化模板来强制执行这些方法的定义。
不幸的是,编译器的不可安装模板的错误消息通常很难破译。
您可以在评论中记录类型要求。看看C ++标准如何定义类型要求,如Assignable,CopyConstructible,EqualityComparable,LessThanComparable以及标准容器中类型的要求。
答案 1 :(得分:3)
您正在寻找的是“concepts”并且曾经是C ++ 0x中的一项功能,但已从新标准中删除。
有一些C ++ 03的实现,但它们更难使用,可能不值得麻烦。例如Boost Concept Checking
gcc也有--enable-concept-check选项,虽然我不完全确定如何使用用户代码。
答案 2 :(得分:2)
编译器将通过无法编译对不存在的函数的任何调用来强制执行正确的接口;也许问题是错误信息太神秘了?
您可以定义一个基类,将所需的接口声明为非虚拟函数。基类函数没有定义(除非有一个带有默认实现的可选函数是有意义的。)
然后,如果模板参数派生自此基类,则无法实现所需的函数将导致链接错误(由于尝试调用未定义的基类函数)。与典型的模板相关的编译错误相比,这很可能更容易诊断。
您可以更进一步,包括编译时检查模板参数是从基类派生的;我将把它作为读者的练习。或者,最好只记录基类的用途,并将其留给用户是否使用它。
答案 3 :(得分:0)
您可以使用界面。