Я пытаюсь создать универсальный фабричный метод в C ++, который может создать экземпляр одного из множества (но конечного числа) объектов. Каждый из объектов требует создания различных типов параметров, поэтому я хочу, чтобы метод каким-то образом выводил желаемый тип, и не хотел, чтобы пользователь указывал его явно.
Вот код для иллюстрации того, что я пытаюсь сделать:
#include <iostream>
using namespace std;
class A {
public:
A(int x, int y) {
cout << "A(" << x << ", " << y << ")\n";
}
};
class B {
public:
B(float a, float b) {
cout << "B(" << a << ", " << b << ")\n";
}
};
template<typename T, typename... Ts>
T * Make(Ts... vs) {
puts(__PRETTY_FUNCTION__); // __FUNCSIG__ or __PRETTY_FUNCTION__
return new T{ vs... };
}
Теперь код, скажем, функции main
может создавать объекты типа A *
и B *
, вызывая Make
следующим образом:
A *a = Make<A>(3, 4);
B *b = Make<B>(3.14f, 6.28f);
Можно ли как-то расширить этот код, чтобы другие функции могли вызывать Make
без необходимости явно указывать, хотят ли они экземпляр A *
или B *
? Например,
A * a = Make(3, 4); // (int, int)
B * b = Make(3.14f, 6.28f); // (float, float)
Я понимаю, что шаблоны функций создаются с использованием вывода типа аргумента, а возвращаемый тип не участвует в этом. Однако компилятор не будет выполнять никаких преобразований типов. Так что Make(int, int)
определенно отличается от Make(float, float)
, и я хочу иметь возможность использовать это для сопоставления определения функции с правильным типом возвращаемого значения.
Вот что я попробовал:
определение явной реализации
template A * Make(int x, int y);
определение специализации
template<>
A * Make<A, int, int>(int x, int y);
Оба не сработали, как ожидалось. Любые идеи о том, как этого можно достичь?