我注意到我遇到的一些“困难” 组合问题可以用某种类型的树搜索来表示,例如 alpha-beta 剪枝、波束搜索或类似的算法。然而,对它们进行编程似乎是重复编码相同的东西,而且也很容易出错。在我看来应该有一个库来实现这些算法,而我应该被要求写的是
很抱歉我没有给出任何具体的代码,但我想我已经解释了这个问题。如果我可以为上述函数编写代码,我是否应该能够轻松运行许多树/图搜索算法?是否有任何用户友好的库/框架可以轻松支持这一点?我希望它能用 Python 或 C/C++ 编写,但也有兴趣听到任何建议。
编辑:更准确地说,我正在谈论知情树搜索算法。
optimization graph-theory a-star generic-programming tree-search
Python 有一个非常有用的函数装饰器特性,而且它允许组合。例如,如果编写一个函数foo,那么您可以声明您希望foo被记忆,但也可以通过以下方式重试 多次,以防缓存未命中foo并引发异常:
@lru_cache
@retry
def foo(...):
Run Code Online (Sandbox Code Playgroud)
装饰器可组合性允许foo独立开发功能和单独的功能装饰器,然后根据需要混合它们。如果我们也可以在 C++ 中这样做(在可能的范围内),那就太好了。
虽然 StackOverflow 上有几个关于函数装饰器的问题,但由于对装饰函数签名的严格假设,它们似乎都生成了不可组合的问题。例如,考虑一下这个问题的最佳投票答案。装饰的形式
template <typename R, typename... Args>
std::function<R (Args...)> memo(R (*fn)(Args...)) {
Run Code Online (Sandbox Code Playgroud)
因此,它不能应用于其自身的结果(对于 memoization 的特定装饰器使用,诚然不是太大的问题)。
那么,我们如何编写可组合的函数装饰器呢?
我正在尝试通过从 Swagger 导入来创建新的 APIGateway,但出现验证错误:
导致问题的特定类是我们的 PaginationModel 类。
代码模型定义:
public class PaginationModel<T>
{
public IEnumerable<T> items { get; set; }
public int offset { get; set; }
public int totalCount { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
Swagger 文件部分表示特定类型的通用分页模型:
*"PaginationModel[DepartmentUIModel]":{"type":"object","properties":{"items": {"type":"array","items":{"$ref":"#/definitions/DepartmentUIModel"}},"offset": {"format":"int32","type":"integer"},"totalCount":{"format":"int32","type":"integer"}}}*
Run Code Online (Sandbox Code Playgroud)
将 Swagger 文件导入 Amazon API Gateway 时出错:
无法为“PaginationModel[DepartmentUIModel]”创建模型:模型名称必须是字母数字:PaginationModel[DepartmentUIModel]
用 '<' 和 '{' 更改了 '[' 但没有解决问题。
除了为所有类型创建特定的分页模型之外,还有什么方法可以让 API Gateway 理解 Swagger 的这个特定输出?
generics generic-programming amazon-web-services swagger aws-api-gateway
我正在尝试使用未知类型参数创建一些函数来通用地应用函数。
让我们以一个可以应用于close(int fd)数组的每个元素的函数为例:
void for_each(void *array[], void (*func)(void *))
{
for (size_t i = 0; array[i] != NULL; ++i)
func(array[i]);
}
Run Code Online (Sandbox Code Playgroud)
如果我想将这个函数与 一起使用close(int fd),我必须制作一个这样的包装函数:
void close_fd(void *fd)
{
close(*(int *)fd);
}
Run Code Online (Sandbox Code Playgroud)
我想将此for_each函数与字符串、浮点数和其他所有内容一起使用。
- 如果没有包装部分,就没有什么可以实现的吗?
- 我知道 C++ 有很多方法可以做到这一点,例如 lambdas、模板等,但是在 C 中有什么好方法吗?妥协?
我从一本书上读了一段代码,但我不太了解语法,
const auto& [local_min, local_max] = minmax(A[i], A[i+1]);
Run Code Online (Sandbox Code Playgroud)
这里A是vector中int和local_min和local_max的int。
我知道minmax返回 a pair,但是方括号有什么作用,即 [local_min, local_max]?我想它不适用于这里的数组。
谢谢。
我想do_something根据泛型类型是否实现来实现有条件的T实现Debug。有没有办法做这样的事情?
struct A(i32);
#[derive(Debug)]
struct B(i32);
struct Foo<T> {
data: T,
/* more fields */
}
impl<T> Foo<T> {
fn do_something(&self) {
/* ... */
println!("Success!");
}
fn do_something(&self)
where
T: Debug,
{
/* ... */
println!("Success on {:?}", self.data);
}
}
fn main() {
let foo = Foo {
data: A(3), /* ... */
};
foo.do_something(); // should call first implementation, because A
// doesn't implement Debug
let foo = Foo {
data: …Run Code Online (Sandbox Code Playgroud) 我正在构建一个简单的 2D 游戏引擎,它变得越来越大,暴露 Lua 中的所有功能将是不可能的:所以我试图自动化一点这个过程,有没有办法获取所有 n 个参数(不同类型)立即从堆栈中取出并直接注入到 C++ 函数中。我已经自动化了函数参数检查。仍然是函数绑定,这有点棘手
例如:我有用于更改精灵位置的正常代码:
int LuaSprite::SetSpritePosition(lua_State* L)
{
Drawable* sprt = (Drawable*)lua_touserdata(L, 1);
int x = (int)lua_tonumber(L, 2);
int y = (int)lua_tonumber(L, 3);
sprt->setPosition(Vec2i(x, y));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我想要实现的概念更像是这样:
int LuaSprite::SetSpritePosition(lua_State* L)
{
LOAD_ARGS(Sprite*, int, int)
GET_ARG(1)->setPosition(Vec2i(GET_ARGS_FROM(1)));
LOAD_RETURN(true, x, y, 3);
return 3;
}
Run Code Online (Sandbox Code Playgroud)
所以
我并不是要求相同的行为,因为它可能是不可能做的,但至少有类似的行为,
而且我确信仅使用“普通”C++ 是无法实现的,而且我还需要一些“神奇”宏。
我没有使用现成的自动 Lua 绑定“库”,因为有自定义结构,并且一些函数正在使用复杂的结构和类,我已经做了很多搜索,但我感到真的迷失了。
我有一些类具有同名的方法。例如
public class People {
private Long id;
private String nm;
private String nmBn;
.............
public Long getId() {
return id;
}
public String getNm() {
return nm;
}
public String getNmBn() {
return nmBn;
}
}
public class Company {
private Long id;
private String nm;
private String nmBn;
.............
public Long getId() {
return id;
}
public String getNm() {
return nm;
}
public String getNmBn() {
return nmBn;
}
}
Run Code Online (Sandbox Code Playgroud)
然后我需要一个像这样工作的方法:
public String getPeopleString(People people) {
if …Run Code Online (Sandbox Code Playgroud) 我试图以无形的方式理解单例类型,并面临对单例类型编译时类型的误解。下面是一个例子:
val x: Witness.`120`.T = 120.narrow
Run Code Online (Sandbox Code Playgroud)
它工作正常,但这种结构看起来很不寻常。什么是Witness.120?在 IDE 中,它指向一些宏函数selectDynamic:
def selectDynamic(tpeSelector: String): Any = macro SingletonTypeMacros.witnessTypeImpl
Run Code Online (Sandbox Code Playgroud)
具有编译时类型Any和由施工判断Witness.120.T一个type部件T。这看起来很神奇......当一个人写下这样的东西时,任何人都可以解释一下实际发生的事情:
val x: Witness.`120`.T = //...
Run Code Online (Sandbox Code Playgroud) 根据参考,非类型模板参数的名称是可选的,即使在分配默认值时也是如此(参见(1)和(2))。因此这些模板结构是有效的:
template <int> struct Foo {};
template <unsigned long = 42> struct Bar {};
Run Code Online (Sandbox Code Playgroud)
我还没有看到访问非类型参数值的可能性。我的问题是:未命名/匿名非类型模板参数有什么意义?为什么名称是可选的?
c++ ×4
templates ×2
a-star ×1
c ×1
c++11 ×1
c++14 ×1
composition ×1
generics ×1
graph-theory ×1
java ×1
lua ×1
luabind ×1
non-type ×1
optimization ×1
rust ×1
scala ×1
shapeless ×1
stl ×1
swagger ×1
tree-search ×1