gpt4 book ai didi

c++ - 将可变类模板的子类传递给只接受基类的函数(通过参数包推导/推理)

转载 作者:太空狗 更新时间:2023-10-29 20:07:17 26 4
gpt4 key购买 nike

**我得到了一些让我的函数成为纯通用函数的建议,这可行,但我更愿意将函数限制为仅接受 Base 及其子项。

在创建可以接受可变模板类基类型参数的函数时遇到问题,而该函数实际上将使用从 Base 派生的类调用。我试过一些东西。这是总体思路。鉴于:

template<typename... Args> struct Base {
std::tuple<Args...> data;
... //other stuff
};

struct DerivedA : Base<string, int> {
};

struct DerviedB : Base<bool, string, int> {
};

创建执行此操作的函数的正确方法是什么:

string moosh_together(Base A, Base B) { //I only need access to Base's members
return get<0>(A.data) + get<1>(B.data);
}

main() {
DerivedA aThing;
get<0>(aThing.data) = "foo";
DerivedB bThing;
get<1>(bThing.data) = "bar'd";
cout << moosh_together(aThing, bThing) << endl;
}

输出:

foobar'd

我已经尝试了 moosh_together 函数的几个变体,但都不起作用。如上保留它会生成有关缺少模板参数的编译器错误。我不确定如何将定义 DerivedA 和 DerivedB 的模板参数传递给函数。

我尝试过的其他方法(shotgun 方法):

string moosh_together(Base<> A, Base<> B) {}
//err: conversion from 'DerivedA' to non-scalar type 'Base<>' requested

template<Base<typename... Args> T1, Base<typename... Args> T2>
string moosh_together(T1 A, T2 B) {}
//err: expected paramter pack before '...'

template<Base<Args...> T1, Base<Args...> T2>
string moosh_together(T1 A, T2 B) {}
//err: 'Args' was not declared in this scope

最佳答案

编辑:

如果你需要两个参数包,你可以把它们都放在模板规范中:

template<typename... ArgsA, typename... ArgsB>
string moosh_together(const Base<ArgsA...>& A, const Base<ArgsB...>& B) {
return get<0>(A.data) + get<1>(B.data);
}

这是有效的,因为参数包是从参数中推断出来的,而不是在列表中指定的。当然,您不能拥有依赖于多个参数包的类。

关于c++ - 将可变类模板的子类传递给只接受基类的函数(通过参数包推导/推理),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3671145/

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