Подтвердить что ты не робот

Повторное использование параметров шаблона через несколько классов

Я воспроизвел с помощью простого кода ниже того, что мне не хватает.
Класс 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();
}
4b9b3361

Ответ 1

Параметры шаблона могут быть выведены из типов аргументов шаблона функции, но не из аргументов конструктора шаблона класса. Таким образом, вы можете делать то, что делает стандартная библиотека (например, с 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);

Обратите внимание, что для этого требуется аргумент 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);

Ответ 2

Нет, поскольку вы создаете объект типа B<int, T>. С С++ 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);

Ответ 3

Не в этом мире.

auto b = make_b(a, 3.0);

(Выполнение make_b слева как упражнение, см. std::make_pair).