用于元编程的 C++ STL 函数等价物
C++ STL functional equivalents for metaprogramming
是否有用于元编程的 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>
)。
是否有用于元编程的 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>
)。