用于元编程的 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>)。