通过多个类重用模板参数
Reuse template parameters through several classes
本文关键字:参数 更新时间:2023-10-16
我在缺少的东西下面用一个简单的代码复制了。
类 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);
否,因为您创建了类型为 B<int, T>
的对象。使用 C++11,您可以使用auto
并编写简单的创建函数
template<int N, typename T>
B<N, T> create(const A<N, T>& in, T scal)
{
return B<N, T>(in, scal);
}
// in main
auto b = create(a, 3.0f);
不在这个世界上。
auto b = make_b(a, 3.0);
(作为练习make_b
的实施;请参阅std::make_pair
)。
相关文章:
- 如何反转整数参数包
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 函数调用中参数的顺序重要吗
- 部分定义/别名模板模板参数
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 使用不带参数的函数访问结构元素
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 如何使用Luacneneneba API正确读取字符串和表参数
- 在派生函数中指定void*参数
- 视图中的参数推导失败:take_while
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- 使用指向成员的指针将成员函数作为参数传递
- 没有名称的C++模板参数
- 如何将enable-if与模板参数和参数包一起使用