在函数模板中输入参数

时间:2014-05-21 07:37:51

标签: c++

在C ++中创建函数模板时,是否可以在类型参数的C#中指定类似通用约束的东西?例如,此函数模板仅对定义<==的类型有意义(在C#中,签名将为int Compare<T>(T item1, T item2) where T : IComparable<T>):

template <typename T>
int compare(const T &item1, const T &item2)
{
    if (item1 == item2) return 0;
    if (item1 < item2) return -1;
    if (item2 < item1) return 1;
}

3 个答案:

答案 0 :(得分:2)

通过使用boost可以实现,但在当前标准中是不可能的。将有概念lite(在特征中)(read this for more information)。现在,您只能编写自己的库,使用std::enable_if或其他内容,或使用boost concept check library

答案 1 :(得分:2)

是的,这是可能的,但不一定是可取的或必需的。

如果您的类型没有提供所需的操作符,那么您无论如何都会收到编译时错误,并说明您无法将操作符应用于这些类型。因此,拥有一个不受限制的模板没有直接的危险

使用元编程技术(如SFINAE)可以完全从重载集中删除模板,除非类型满足约束条件,因此模板定义永远不会被考虑,但这可能会导致更奇怪的情况和错误消息。有时希望或有必要从考虑中去除过载(通常用于构造函数),但这似乎并非如此。此外,执行此操作的技术有点冗长和临时性。

C ++的未来版本可能会尝试通过 concepts 解决这个问题,但这还不是一项成熟的技术。

答案 2 :(得分:0)

一般来看看SFINAE。

在c ++ 11中,SFINAE有很多帮助功能,比如enable_if和很多类型特征。是的,您还可以检查是否存在给定类型的成员函数。

技巧通常是,模板声明失败但如果在定义块之前出现失败则不会出错。