coi*_*oin 12 c++ templates c++11
我在下面用一个简单的代码复制了我遗漏的东西.
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();
}
Run Code Online (Sandbox Code Playgroud)
Mik*_*our 16
模板参数可以从函数模板的参数类型推导出来,但不能从类模板的构造函数参数中推导出来.所以你可以做标准库所做的事情(例如用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);
Run Code Online (Sandbox Code Playgroud)
请注意,这需要一个float参数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);
Run Code Online (Sandbox Code Playgroud)
不,因为您创建了类型的对象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);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
870 次 |
| 最近记录: |