gpt4 book ai didi

c++ - 带有参数包的模板特化

转载 作者:行者123 更新时间:2023-12-03 06:54:27 25 4
gpt4 key购买 nike

我是 c++ 的新手,但想尝试做一些花哨的模板。我不确定这是否可能,但我相当有信心有办法实现这一目标。

问题来了:我正在调用各种硬件函数,它需要多个参数并且只有一种参数类型不同:

int Read(HANDLE handle, int location, char* Name, int startindex1, int endindex1,
int startindex2, int endindex2, int* rval, Astruct* callback) ;
int Read(HANDLE handle, int location, char* Name, int startindex1, int endindex1,
int startindex2, int endindex2, double* rval, Astruct* callback) ;

硬件接口(interface)根据索引值返回标量、数组或矩阵。我真正想要实现的是一个函数,它返回一个 Tvector<T>vector<vector<T>>取决于我传递的参数数量。:

                T MyReadFunction<T>(HANDLE handle, int location, char* Name,int index)
vector<T> MyReadFunction<T>(HANDLE handle, int location, char* Name,int startindex1,
int endindex1 )
vector<vector<T>> MyReadFunction<T>(HANDLE handle, int location, char* Name,int startindex1,
int endindex1
int startindex2,
int endindex2)

哪里T是基本类型,如 int , real , float , double

使用 3 个具有特化的不同模板没有问题,但我很乐意以某种方式将其结合起来。

我的假设是,这可以使用模板特化来实现,但我无法理解它。我想我应该这样:

template<typename T ,int... Indexes>
T MyReadFunction (HANDLE handle, int location, char* Name, Indexes... myIndex){}

template<>
int MyReadFunction (HANDLE handle, int location, char* Name, int myindex)
{
int rval = 0;
Read (handle,location,name,myindex,myindey,0,0,&rval, NULL) ;
return rval;
}

这是一头双头野兽。我可能需要显式地实现我的 3 个案例以避免误用,但我也想知道,我如何根据参数包的大小通过不同大小的参数包实现模板特化。

我在 VS 2019 中使用最新的 msvc++

最佳答案

您可以编写一个类型来创建所需等级的嵌套 vector ,如下所示:

template<typename T,int N> 
struct VT
{
using type = typename std::vector<typename VT<T, N - 1>::type>;
};

template<typename T>
struct VT<T, 0>
{
using type = int;
};

然后像这样写一个函数:

template<typename T ,typename ...Indexes>
typename VT<T, sizeof...(Indexes) / 2>::type
MyReadFunction (int handle, int location, char* Name, Indexes... myIndex) {}

这是一个 demo .

正如您所观察到的,这样做并没有多大意义,因为函数体的实现会变得相当棘手。简单地编写特化或重载将是一个更简单的解决方案。

请注意,如果您选择编写此函数模板,则 myIndex 参数包不受约束,即它将接受 int 以外的类型。当然,您可以通过多写一点代码来限制它。

此外,此函数模板将接受大小为 3、5、7 等的 Indexes,这可能不是您想要的。同样,您也可以通过编写更多代码来限制它。

关于c++ - 带有参数包的模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64278096/

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