c++ - 是否可以(以及如何)为 C++ 模板函数参数添加类型协定检查?

标签 c++ templates types typeclass

例如,我想实现自己的通用排序功能,我想要求传入的类型为 Indexable , 里面的元素是 Comparable

template <typename Cont>
    **type_check: Cont is Indexable, Cont::Element is Comparable**
void my_sort(Cont& cont){
    // do sorting work
}

当我做 my_sort(vector<int>{1,6,5,4})会好的

但是什么时候做 my_sort(linkedlist<int>{1,6,5,4})会让我在编译/运行时失败,因为 linkedlist不是 Indexable .

那么有没有办法进行这种类型契约编程呢?

附言我在 C++ 11 环境中,但也欢迎任何更高版本的 C++ 中的解决方案

最佳答案

使用 SFINAE,您可以执行以下操作:

template <typename Cont>
auto my_sort(Cont& cont)
-> decltype(cont[42], // Indexable
            void(), // That void to avoid evil overload of operator comma
            std::declval<Cont::Element>() < std::declval<Cont::Element>(), // Comparable
            void()) // That final void for the return type of sort
{
    // do sorting work
}

std::enable_if如果您准备好特征,则可以选择(decltype)。

关于c++ - 是否可以(以及如何)为 C++ 模板函数参数添加类型协定检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50265294/

相关文章:

c++ - 为模板化类型确定正确谓词的方法

c++ - 如何在 Cython 中返回新的 C++ 对象?

c++ - Boost uBLAS 矩阵引用

c++ - 将字符串转换为 wstring [没有 locale::global 的俄罗斯符号]

c++ - 将 lambda 传递给成员变量的构造函数

pointers - 如何将一个 reflect.Type 转换为它的 ptr 类型?

c++ - Boost Fusion 文章、示例、教程?

c++ - 使用 std::remove_pointer 等操作在模板中构建派生类型

python - 确定在 python 中表示为字符串的值的类型

pointers - 是否可以将接口(interface)对象传递给 interface{} 类型?