gpt4 book ai didi

c++ - 如何将 Varaidic 模板化为模板中的返回类型?

转载 作者:行者123 更新时间:2023-12-03 10:05:29 25 4
gpt4 key购买 nike

我被可变参数模板问题困住了。
上下文
一方面,我使用一个库,其功能看起来像

template<class ...Cols>
void doForVars(Cols&... args) {
...
}

另一方面,我有很多结构
struct Foo {
int id;
std::string name;
double length;
}

struct Bar {
int id;
double someProperty;
double someOther;
}
我必须让他们每个人都使用一个专门的模板

template<>
void doSomething(Foo& foo) {
//boilerplate
doForVars( foo.id, foo.name, foo.length);
}


template<>
void doSomething(Bar& bar) {
//boilerplate
doForVars( bar.id, bar.someProperty, bar.someOther);
}

问题和期望
因为我得到了 50 多种类型,例如 FooBar有 10 到 30 个字段,有很多样板可以复制和粘贴。
它很容易出错,而且违反了 DRY,我可以接受:)
所以,我正在寻找为函数创建模板 listFields(T& t)仅列出记录 T 的字段,其返回值对于 doForVars(Cols...&cols) 来说是可接受的.
template<typename T>
void doSomething(T& t) {
//boilerplate
doForVars(listFields(t));
}

但是我没有成功地将这个模板 returnint 写成一个可变参数类型。
template<typename T, ?>
<I don't know> listFields(T& t);
比如我可以写
template<>
<I don't know> listFields(Foo& foo) {
return <I don't know>( foo.id, foo.name, foo.length);
}

template<>
<I don't know> listFields(Bar& bar) {
return <I don't know>( bar.id, bar.someProperty, bar.someOther);
}

可变参数显示为输入,但如何将它们用于输出?
提前致谢。
编辑
谢谢你的回答我正在阅读。正如我写的那样,我得到了很多要描述和使用的记录([SCOS 2000 MIB 记录类型]) 1
我用于可变参数的库是这颗 gem https://github.com/d99kris/rapidcsv
我用它来解析一些制表分隔值文件并将每一行映射到我的记录。很流畅。

最佳答案

你不能从一个函数返回多种类型,即使它是一个可变参数模板。但是,您可以返回 tuple包含作为特定类成员的所有类型。此外,似乎没有理由为您的每个 Foo 编写模板特化。 , Bar等。相反,您可以为每种类型的重载集添加一个函数:

std::tuple<int, std::string, double> listFields(Foo& foo)
{
return {foo.id, foo.name, foo.length};
}

std::tuple<int, double, double> listFields(Bar& bar)
{
return {bar.id, bar.someProperty, bar.someOther};
}
现在起 doForVars是可变参数模板,需要解压 tuple返回表格 listFields ,您可以使用 std::apply像这样:
template<typename T>
void doSomething(T& t) {
// ...
std::apply([](auto &&... args) { doForVars(args...); }, listFields(t));
}
这是一个 demo

关于c++ - 如何将 Varaidic 模板化为模板中的返回类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64976171/

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