gpt4 book ai didi

c++ - 如何编写从函数参数推断的 C++ 模板?

转载 作者:行者123 更新时间:2023-12-04 14:50:14 25 4
gpt4 key购买 nike

我正在尝试编写一个 C++ 函数,它通过对参数函数的两次调用生成一个 vector 。参数函数接受一个整数指针和一个指向元素数组的指针。如果用 nullptr 调用元素,它将用它必须生成的元素数填充整数。然后在第二次调用时,它将用那么多实例填充元素内存。

因此,此模式可用于获取元素 vector 。我经常重复这段代码,所以我写了一个函数来为我做这件事:

template<typename TElement>
std::vector<TElement> LoadArray(std::function<void(uint32_t*, TElement*)> const func) {
uint32_t count;
func(&count, nullptr);

std::vector<TElement> elements(count);
func(&count, elements.data());

return elements;
}

但是,调用此函数时,我必须在模板中指定 TElement 以及函数:

std::vector<Cat> cats = LoadArray<Cat>([](uint32_t* const count, Cat* const cats) {
LoadCats(count, cats);
});

如何在 C++20 中自动进行这种类型推断?

编辑:所有函数都有不同的签名。有些有返回类型,有些没有;有些在计数和数组之前接受参数,有些在之后接受参数。

最佳答案

执行此操作的一种简单方法是延迟查找,直到您在函数内返回 auto

沿着这些一般路线的东西:

// The stolen function_traits struct...thing
template<typename T>
struct load_array_cb_traits;

template<typename Ret, typename Arg2>
struct load_array_cb_traits<std::function<Ret(uint32_t*, Arg2*)>> {
using return_type = Ret;
using elem_type = Arg2;
};

template<typename FuncT>
auto LoadArray(const FuncT& func) {
using traits = load_array_cb_traits<decltype(std::function{func})>;

using TElement = std::decay_t<typename traits::elem_type>;
using TRet = std::decay_t<typename traits::return_type>;

uint32_t count;
func(&count, nullptr);

std::vector<TElement> elements(count);
func(&count, elements.data());

return elements;
}

关于c++ - 如何编写从函数参数推断的 C++ 模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69212217/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com