假设您只有作为工具一个 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>()
将是 true
,is_in_range<6001>()
将是 false
。我需要找到极限,在本例中为 6000
。
我知道您基本上可以参考二分搜索,但问题是,它必须尽可能优化并生成尽可能少的实例。
对于模板部分,我看到了两种方式:
我不想让问题过于复杂,而是将其限制在实际问题(子问题)的范围内。以下不是问题的一部分,而是对限制原因的见解。
为了在编译时推断结构的成员,我使用聚合初始化。
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]();
}