C++ C++;:强制模板类型实现一个方法

C++ C++;:强制模板类型实现一个方法,c++,templates,interface,C++,Templates,Interface,我有一个模板类,我想知道是否可以强制该模板类类型实现某个接口,特别是我想强制该类型重载操作符=方法。我将用Java编写: public class Tree<T implements IComparable>{ public Tree(Vector<T> x){...} } 公共类树{ 公共树(向量x){…} } < C++中的替代方案是什么?简短回答: 没有;没有语言功能可以执行此操作 短浅的回答: 可以使用SFINAE和静态断言(在编译时评估的断言)来实现

我有一个模板类,我想知道是否可以强制该模板类类型实现某个接口,特别是我想强制该类型重载
操作符=
方法。我将用Java编写:

public class Tree<T implements IComparable>{
    public Tree(Vector<T> x){...}
}
公共类树{
公共树(向量x){…}
}
< C++中的替代方案是什么?

简短回答: 没有;没有语言功能可以执行此操作

短浅的回答: 可以使用
SFINAE
和静态断言(在编译时评估的断言)来实现您想要的效果。不幸的是,这是一个不平凡的过程,需要对模板元编程有很好的理解

长篇大论的回答:
这些特性是为新的C++11标准提出的,但没有通过审查过程。在这里阅读更多。在本次会议(波特兰10月12日至19日)上,Herb Sutter建议我们尝试分两个阶段发布(先发布一个次要版本,然后发布一个新的功能版本),概念将包含在第一个次要版本中。该提案是否被接受将在会议后可用。

只要编写代码,假设它被接受。否则,当用户传入不一致类型时,它将无法编译。这里不需要显式的特性。但是,究竟为什么您需要像IComparable这样的接口来实现这一点呢?模板是鸭型的


但是模板错误可能会变得很严重。您可以使用类型特征和静态断言来简化此操作。但是,标准没有提供这样的特性,因此您必须使用SFINAE编写一个。

实际上,使用SFINAE和重载技巧是可能的。不完全正确。只有使用了该功能,它才能编译失败。例如,我可以使用
Tree
,它可能仍然可以编译,即使它没有实现IComparable。或者我可以使用
Tree
,其中PLOP没有实现IComparable,但出于某种原因,我的代码没有插入任何成员(例如不完整的测试套件)@LokiAstari:有人可能会争辩说,DeadMG意味着使用
只需编写代码,前提是它确实可以
@phresnel:一个真实的单词示例:您可能希望强制标准向量中的类型是可复制的。否则某些东西会刹车。但是你可以做
std::vector x如果不重新调整内部结构的大小,它将不会中断(即使在测试中)。因此,很有可能会有根本上被破坏的代码(但似乎有效)。我认为问题的实质是我们希望它总是在编译时中断。如果我们使用某些功能,编译时不会中断。如果您从未调用该函数,那么您就不需要它,是吗?@DeadMG:非常正确。但这是另一个问题。问题是如何强制模板参数实现接口。有很好的理由可以这样做(假设您不能在一天内编写整个应用程序)。@LokiAstari:因为在C++03和C++11中,都可以(而且是)检查模板参数是否有特定的运算符重载,或者它是否派生自特定的接口,或者导致硬编译错误(通过静态断言)或软SFINAE错误。概念(尽管不同的人不同意他们应该是什么样的)只是试图使人们已经做的事情成为“正式的方式”,例如借助于特征类。