gpt4 book ai didi

c++ - C++ 中的类型推导以获取位置信息

转载 作者:行者123 更新时间:2023-12-05 02:26:26 26 4
gpt4 key购买 nike

假设我有一组遵循以下模式的函数:

template <typename T, typename ... Args>
T example(Args ... args, T* defaultValue);

此外,我还有另一个对这些集合进行操作的函数:

template <auto Function, typename T, typename ... Args>
auto transform(Args ... args) {
// ...
T defaultValue /* = ... */;
auto result = Function(args... , &defaultValue);
// ...
return result;
}

例如,transform 函数可以像这样使用

auto result = transform<ExampleFunction, ExampleT>(int a, int b, int c);

编译器完成Args 的类型。但是我遇到了必须指定 T 的问题。但是我知道 T 始终是 Function 参数的最后一种类型。

有没有办法“教”编译器这个属性,这样我就可以调用转换在不指定 T 的情况下运行?

auto result = transform<ExampleFunction>(int a, int b, int c);

例子

在 vulkan 中有这些函数 vkEnumerateInstanceExtensionProperties 等等。您总是必须调用这些函数两次才能检索某些数据。我想创建一个函数 listify,它将此数据作为 vector 返回。

template <auto Function, typename T, typename ... Args>
auto listify(Args ... args)
{
uint32_t size;
Function(args... , &size, nullptr);
std::vector<T> result(size);
Function(args... , &size, result.data());
return result;
}

我想这样调用这个函数

auto result = listify<vkEnumerateInstanceExtensionProperties>(nullptr);

最佳答案

您可以从函数中获取参数。

例如你可以这样做

#include <tuple>

template<typename F>
struct last_arg{};

template<typename ret, typename ...args>
struct last_arg<ret(*)(args...)>{
using type = std::tuple_element_t<sizeof...(args)-1,std::tuple<args...>>;
};

template <auto F, typename ...Args>
auto f(Args... args) {
// in this case it's unlikely you'd want to specify T, so you can move it out from template parameter
using T=std::remove_pointer_t<typename last_arg<decltype(F)>::type>;

T defaultValue;
auto result = F(args... , &defaultValue);
return result;
}

int bar(int,int*);
void foo(){
f<bar>(1);
}

(这假设函数不是函数对象,但这也是可能的)

关于c++ - C++ 中的类型推导以获取位置信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73778901/

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