gpt4 book ai didi

c++ - 通过几个类重用模板参数

转载 作者:IT老高 更新时间:2023-10-28 23:11:06 25 4
gpt4 key购买 nike

我用一个简单的代码复制了我缺少的东西。
B 类拥有 A 类作为成员并使用相同的类型名。
我想避免复制这些模板,以便在 main() 中我可以调用类似 B b(a, 3.0) 之类的东西,这将重用来自 A 的模板。这可能吗?

#include <iostream>
#include <vector>

template<int N, typename T=double>
struct A
{
A(T val) : vecA(N, val) {}
void print() { for (auto i : vecA) std::cout << i << ";"; }
std::vector<T> vecA;
};

template<int N, typename T>
struct B
{
B(const A<N,T> & in, T scal) : a(in), scalB(scal) {}
void print() { a.print(); std::cout << " | " << scalB << std::endl; }
A<N,T> a;
T scalB;
};


int main()
{
A<5,float> a(2.0);
B<5,float> b(a, 3.0); // This is redundancy. Can I do something like B b(a,3.0) ?
b.print();
}

最佳答案

模板参数可以从函数模板的参数类型推导出来,但不能从类模板的构造函数参数中推导出来。所以你可以做标准库所做的事情(例如使用 make_pair)并编写一个函数来为你推断它们:

template <int N, typename T>
B<N,T> make_b(const A<N,T> & in, T scal) {
return B<N,T>(in, scal);
}

auto b = make_b(a, 3.0f);

请注意,这需要一个浮点参数 3.0f,以匹配 a 的类型。如果您想允许对第二个参数进行转换,您可以单独参数化该类型:

template <int N, typename T, typename T2>
B<N,T> make_b(const A<N,T> & in, T2 scal) {
return B<N,T>(in, scal);
}

auto b = make_b(a, 3.0);

关于c++ - 通过几个类重用模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27523282/

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