标签: generic-programming

用于组合优化问题的树搜索库

我注意到我遇到的一些“困难” 组合问题可以用某种类型的树搜索来表示,例如 alpha-beta 剪枝、波束搜索或类似的算法。然而,对它们进行编程似乎是重复编码相同的东西,而且也很容易出错。在我看来应该有一个库来实现这些算法,而我应该被要求写的是

  1. 解决方案的编码,即如何从不完整的解决方案中获得更具体的解决方案。这将给出树/图结构。
  2. 给定部分解决方案,如何获得最大/最小成本,以及可能的成本估计。
  3. 初始解决方案/部分解决方案。
  4. 也许是某种验证解决方案。

很抱歉我没有给出任何具体的代码,但我想我已经解释了这个问题。如果我可以为上述函数编写代码,我是否应该能够轻松运行许多树/图搜索算法?是否有任何用户友好的库/框架可以轻松支持这一点?我希望它能用 Python 或 C/C++ 编写,但也有兴趣听到任何建议。

编辑:更准确地说,我正在谈论知情树搜索算法。

optimization graph-theory a-star generic-programming tree-search

5
推荐指数
1
解决办法
1081
查看次数

可组合的 C++ 函数装饰器

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 的特定装饰器使用,诚然不是太大的问题)。

那么,我们如何编写可组合的函数装饰器呢?

c++ composition generic-programming python-decorators c++14

5
推荐指数
2
解决办法
1364
查看次数

从 Swagger 错误导入 Amazon API Gateway - 不采用泛型

我正在尝试通过从 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

5
推荐指数
1
解决办法
2035
查看次数

C中采用未知类型参数的泛型函数

我正在尝试使用未知类型参数创建一些函数来通用地应用函数。

让我们以一个可以应用于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 中有什么好方法吗?妥协

c generic-programming

5
推荐指数
1
解决办法
1000
查看次数

C++中的方括号和pair类型

我从一本书上读了一段代码,但我不太了解语法,

const auto& [local_min, local_max] = minmax(A[i], A[i+1]);
Run Code Online (Sandbox Code Playgroud)

这里Avectorintlocal_minlocal_maxint

我知道minmax返回 a pair,但是方括号有什么作用,即 [local_min, local_max]?我想它不适用于这里的数组。

谢谢。

c++ templates stl generic-programming c++11

5
推荐指数
0
解决办法
4015
查看次数

如何根据泛型类型是否实现特征以不同方式实现函数?

我想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)

generic-programming rust

5
推荐指数
1
解决办法
577
查看次数

使用 C++ 自动 Lua 绑定

我正在构建一个简单的 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)

所以

  • LOAD_ARGS将从堆栈中分别获取给定的类型。
  • GET_ARG(i) 将获取索引 i 处的 arg。
  • GET_ARGS_FROM(i) 将执行类似 x,y,z,type 的操作

我并不是要求相同的行为,因为它可能是不可能做的,但至少有类似的行为,
而且我确信仅使用“普通”C++ 是无法实现的,而且我还需要一些“神奇”宏。
我没有使用现成的自动 Lua 绑定“库”,因为有自定义结构,并且一些函数正在使用复杂的结构和类,我已经做了很多搜索,但我感到真的迷失了。

c++ lua generic-programming luabind

5
推荐指数
2
解决办法
8273
查看次数

从不同的类调用同名方法

我有一些类具有同名的方法。例如

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)

java generic-programming

5
推荐指数
1
解决办法
1536
查看次数

Shapeless Witness 以及它如何给出实际的单例类型

我试图以无形的方式理解单例类型,并面临对单例类型编译时类型的误解。下面是一个例子:

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)

scala generic-programming type-level-computation shapeless

5
推荐指数
1
解决办法
634
查看次数

未命名的非类型模板参数有什么意义?

根据参考,非类型模板参数的名称是可选的,即使在分配默认值时也是如此(参见(1)和(2))。因此这些模板结构是有效的:

template <int> struct Foo {};
template <unsigned long = 42> struct Bar {};
Run Code Online (Sandbox Code Playgroud)

我还没有看到访问非类型参数值的可能性。我的问题是:未命名/匿名非类型模板参数有什么意义?为什么名称是可选的?

c++ templates generic-programming non-type

5
推荐指数
2
解决办法
329
查看次数