Zrób szablon klasy, gdzie piersza składowa będzie miała generowany typ
template <class T>
class licz
{
T val;
int int_val;
...
}
i użyj tej klasy w vectorze.
Przecież licz<int>
ma inny typ niż licz<char>
więc jak chcesz zinstancjonować vector tego template?
Prawdopodobnie da się to zrobić prościej:
class Ilicz {
public:
virtual ~Ilicz() {}
//tutaj deklaracje metod, które chcesz wywoływać
virtual int countOfSomething() = 0;
};
template <class T>
class licz : public Ilicz {
T val;
int int_val;
public:
virtual int countOfSomething() override
{
return int_val;
}
licz(T val, int int_val)
: val{ std::move(val) }
, int_val{ int_val }
{
}
};
int main()
{
std::vector<std::unique_ptr<Ilicz>> v;
v.push_back(std::make_unique<licz<char>>('q', 42));
v.push_back(std::make_unique<licz<std::string>>("string", 21));
for (const auto& elem : v) {
std::cout << elem->countOfSomething() << '\n';
}
}
https://wandbox.org/permlink/saRDFX8iev9eZXJF
Edit:
możesz też użyć std::variant
i std::visit
:
template <class T>
class licz {
T val;
int int_val;
public:
int countOfSomething() const
{
return int_val;
}
T getVal() const
{
return val;
}
licz(T val, int int_val)
: val{ std::move(val) }
, int_val{ int_val }
{
}
};
int main()
{
std::vector<std::variant<licz<char>, licz<std::string>>> var;
var.push_back(licz<std::string>("string", 21));
var.push_back(licz<char>('q', 42));
for (const auto& elem : var) {
std::visit(
make_overload(
[](const licz<char>& x) {
std::cout << "jestem licz<char> val: " << x.getVal() << " int_val:" << x.countOfSomething() << '\n';
},
[](const licz<std::string>& x) {
std::cout << "jestem licz<std::string> val: " << x.getVal() << " int_val:" << x.countOfSomething() << '\n';
}),
elem);
}
return 0;
}
https://wandbox.org/permlink/vQyLWImXdeZAB4h2
Tutaj więcej o variant
i make_overload
: https://vittorioromeo.info/index/blog/variants_lambdas_part_1.html