在编译时计算范围的限制

时间:2021-05-25 09:01:00

标签: c++ algorithm c++11 templates

假设您只有作为工具一个 SFINAE 类,它接受一个索引并产生 std::true_type 如果它在范围内,如何找到极限? 这是确切的要求,不能使用其他任何东西

这是一个结构体的示例签名。 L 此处用于测试。在真正的结构体中会有 typename T 作为第二个参数,但它与问题无关

template <size_t I, size_t L = 6000>
struct is_in_range : std::integral_constant<bool, (I < L)> {};

例如:您有 6000 个元素的范围。 is_in_range<2>() 将是 trueis_in_range<6001>() 将是 false。我需要找到极限,在本例中为 6000

我知道您基本上可以参考二分搜索,但问题是,它必须尽可能优化生成尽可能少的实例

对于模板部分,我看到了两种方式:

  • 模板 constexpr 递归函数(一个糟糕的函数,臃肿的代码,但我可以做到)
  • SFINAE(对我来说太复杂了)

我不想让问题过于复杂,而是将其限制在实际问题(子问题)的范围内。以下不是问题的一部分,而是对限制原因的见解。

这不是问题的一部分,不讨论,因为C++中的反射问题太复杂了。

为了在编译时推断结构的成员,我使用聚合初始化。

template <typename Allowed>
struct explicitly_convertible
{
   operator Allowed();
}

struct pod
{
   int a;
   int arr[46];
   char c;
   float arr2[38];
};

实现如下:

// checks if this is well-formed to deduce the type of an element
   decltype(pod{{explicitly_convertible<int>()}});

因此,如您所见,推断数组大小的唯一方法是在聚合初始化时用 N 个元素探测 T 的初始化。

在 C++ 中,函数或方法不能返回数组,因此这是不可接受的:

template <typename T, size_t N>
struct non_acceptable
{
   operator T[N]();
}

0 个答案:

没有答案