如何为启发式函数编写 C++ 概念
How to write a c++ concept for Heuristic function
我正在用 C++ 20 实现一个带有启发式函数的搜索算法。
我试图用这样的概念来限制我的算法可以使用的函数:
template<typename SelfType, unsigned from, unsigned to>
concept Heuristic = requires(SelfType h, unsigned current)
{
{ h(current) } -> unsigned;
assert(h(to) == 0);
};
然后我可以这样写:
template<unsigned from, unsigned to>
struct H
{
unsigned operator()(unsigned current)
{
return to - current + 100;
}
};
当然断言不起作用,这不是有效的启发式方法,因为这里 h(to) 是 100。我想让编译器在编译时检查 h(to) 是否等于 0。
I want to make the compiler check in compile time that h(to) equals 0.
只有编译器能够在编译时调用 h(to)
时才有可能。它不能,因为不能保证调用的任何函数都是 constexpr
。 SelfType
可以是函数指针类型,函数指针不携带 constexpr
。概念甚至无法检查某物是否为常量表达式。
当您开始思考值是否映射到正确的域,或者函数是否将值映射到域时,这不再是真正的 "concept"。或者至少,它不是语言功能意义上的概念。
也就是说,当我们认为某些事情是语言无法验证的概念的特定用户的要求时。 C++20 概念库充满了这些公理化的概念需求。
这也是为什么你应该为你的启发式方法使用命名成员函数的一个很好的理由,而不是假设任何具有 operator()
重载的东西恰好从无符号整数映射到无符号整数是"heuristic".
我正在用 C++ 20 实现一个带有启发式函数的搜索算法。 我试图用这样的概念来限制我的算法可以使用的函数:
template<typename SelfType, unsigned from, unsigned to>
concept Heuristic = requires(SelfType h, unsigned current)
{
{ h(current) } -> unsigned;
assert(h(to) == 0);
};
然后我可以这样写:
template<unsigned from, unsigned to>
struct H
{
unsigned operator()(unsigned current)
{
return to - current + 100;
}
};
当然断言不起作用,这不是有效的启发式方法,因为这里 h(to) 是 100。我想让编译器在编译时检查 h(to) 是否等于 0。
I want to make the compiler check in compile time that h(to) equals 0.
只有编译器能够在编译时调用 h(to)
时才有可能。它不能,因为不能保证调用的任何函数都是 constexpr
。 SelfType
可以是函数指针类型,函数指针不携带 constexpr
。概念甚至无法检查某物是否为常量表达式。
当您开始思考值是否映射到正确的域,或者函数是否将值映射到域时,这不再是真正的 "concept"。或者至少,它不是语言功能意义上的概念。
也就是说,当我们认为某些事情是语言无法验证的概念的特定用户的要求时。 C++20 概念库充满了这些公理化的概念需求。
这也是为什么你应该为你的启发式方法使用命名成员函数的一个很好的理由,而不是假设任何具有 operator()
重载的东西恰好从无符号整数映射到无符号整数是"heuristic".