强制使用通用方法名称

| 注意:这是对此的后续问题。 我有一组模板类,它们使用完全不同的数据类型以完全不同的方式完成完全不同的事情。但是,它们确实共享通用方法名称。例如,for0ѭ,
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);
}
现在,我只是依靠自己的内存来正确定义所有适当的方法。有没有办法让编译器强制执行正确方法的定义?如果没有,还有更好的方法吗?     
已邀请:
编译器将通过不编译对不存在的函数的任何调用来强制执行正确的接口;也许问题在于错误消息过于含糊? 您可以定义一个基类,该基类将所需的接口声明为非虚函数。基类函数没有定义(除非具有默认实现的可选函数有意义)。 然后,如果template参数是从该基类派生的,则未能实现所需的函数将导致链接错误(由于尝试调用未定义的基类函数)。与典型的模板相关的编译错误相比,这很可能更容易诊断。 您可以再进一步一步,并在编译时检查模板参数是否从基类派生。我将其留给读者练习。或者,最好只记录基类的用途,然后由用户决定是否使用它。     
您要寻找的是\“ concepts \”,它曾经是C ++ 0x的功能,但已从新标准中删除。 有一些C ++ 03的实现,但是它们较难使用,可能不值得为此烦恼。例如提升概念检查 gcc还具有--enable-concept-check选项,尽管我不确定是否可以与用户代码一起使用。     
编译器已经通过拒绝让您实例化未提供必要方法的类型的模板来强制执行这些方法的定义。 不幸的是,编译器针对无法实例化的模板的错误消息通常难以解读。 您可以在注释中记录类型要求。看看C ++标准如何定义类型要求,例如Assignable,CopyConstructible,EqualityComparable,LessThanComparable,以及标准容器中的类型要求。     
您可以使用界面。 看到这个问题:如何在C ++中声明一个接口?     

要回复问题请先登录注册