通过多个类重用模板参数

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)。