gpt4 book ai didi

用于元编程的 C++ STL 函数等价物

转载 作者:搜寻专家 更新时间:2023-10-31 00:10:48 24 4
gpt4 key购买 nike

是否有 constexpr 或其他编译时等同于 STL 功能库和其他用于元编程的库?更具体地说,我正在尝试编写一些使用 SFINAE 来评估某些条件并生成相应类型的元程序。示例:

template<int A, int B>
enable_if_t<(A < B)> my_func() {// do something
}

template<int A, int B>
enable_if_t<!(A < B)> my_func() {// do nothing
}

理想情况下,我希望用户能够传入比较器(如 std::less<int> ),而不是将其硬编码为 < .所以像这样:

template<int A, int B, class comp = std::less<int>>
enable_if_t<comp(A, B)> my_func() {// do something
}

template<int A, int B, class comp = std::less<int>>
enable_if_t<comp(A, B)> my_func() {// do nothing
}

然而,由于函数对象不是常量表达式,它们不会在编译时被求值,所以这是行不通的。实现此类内容的正确方法是什么?

最佳答案

std::less<int>(int, int)不是 std::less 的构造函数. std::less 的唯一构造函数是() (我更喜欢使用 {} ,因为它清楚地表明我正在构建一些东西)。

从 C++14 开始它有一个 constexpr operator()可以在编译时评估(如果 < 在所涉及的类型上是 constexpr )。

因此:

template<int A, int B, class comp = std::less<int>>
enable_if_t<comp{}(A, B)> my_func() {// do something
}

template<int A, int B, class comp = std::less<int>>
enable_if_t<!comp{}(A, B)> my_func() {// do nothing
}

应该可以。

在 C++11 中

namespace notstd {
template<class T=void>
struct less {
constexpr bool operator()(T const& lhs, T const& rhs)const{
return lhs<rhs;
}
};
template<>
struct less<void> {
template<class T, class U>
constexpr bool operator()(T const& lhs, U const& rhs)const{
return lhs<rhs;
}
// maybe also add this:
//struct is_transparent {};
}
}

(假设您系统上的 < 是指针的总顺序)应该可以工作(将 std::less<T> 替换为 notstd::less<T> )。

关于用于元编程的 C++ STL 函数等价物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36506160/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com