我目前正在使用模板類在 C 中撰寫程式:
template<typename TYPE>
class TemplateClass {
private:
TYPE t;
};
我有另一個類作為我的管理器,TemplateClass它應該將這個類的多個實體存盤在一個向量中。不同的實體應該有不同的型別,例如int,std::string等。用 Java 的方式來說,解決方案是只使用下面示例中的內容,但在 C 中似乎不可能。
class ManagerClass {
private:
// Here seems to be the problem.
std::vector<TemplateClass<?>> templates;
}
有可能做這樣的事情嗎?
謝謝大家的回答
uj5u.com熱心網友回復:
如果您知道將std::vector在編譯時存盤的所有型別,我會std::variant在這種情況下使用 an 。
// This is used for the visitor pattern.
template<class... Ts> struct overload : Ts... { using Ts::operator()...; };
// The below line not needed in C 20...
template<class... Ts> overload(Ts...) -> overload<Ts...>;
template<typename T>
struct MyClass { T value; };
using types = std::variant<
MyClass<std::string>,
MyClass<int>,
MyClass<double>>;
int main()
{
std::vector<types> stuff{};
stuff.push_back(MyClass<std::string>{});
stuff.push_back(MyClass<int>{});
stuff.push_back(MyClass<double>{});
for(const auto& v : stuff)
{
if (std::holds_alternative<MyClass<std::string>>(v))
{
std::cout << "Im a string\n";
}
else if (auto* p{std::get_if<MyClass<int>>(&v)})
{
std::cout << "Im an int\n";
}
else
{
auto t = std::get<MyClass<double>>(v);
std::cout << "Im a double\n";
}
// Or you can use the visitor pattern.
std::visit(overload{
[](const MyClass<std::string>& ) { std::cout << "I'm a string\n"; },
[](const MyClass<int>& ) { std::cout << "I'm a int\n"; },
[](const MyClass<double>& ) { std::cout << "I'm a double\n"; },
}, v);
}
}
uj5u.com熱心網友回復:
如果可以使用 C 17,則可以使用std::any或std::variant.
class ManagerClass {
private:
using variant_type = std::variant<
TemplateClass<std::string>,
TemplateClass<int>,
TemplateClass<double> >;
std::vector<variant_type> templates;
};
uj5u.com熱心網友回復:
這是通過運行時polymorphishm實作的一種方法,它是通過函式覆寫來實作的。當派生類具有基類的成員函式之一的定義時,就會發生函式覆寫。據說該基本功能已被覆寫。
#include <iostream>
#include <vector>
using namespace std;
// Base class declaration
class Base {
public:
virtual void print()
{
cout << "Base" << endl;
}
virtual ~Base(){}
};
// Derived Class 1
class Derived1 : public Base {
public:
void print()
{
cout << "Derived1" << endl;
}
};
// Derived class 2
class Derived2 : public Base {
public:
void print()
{
cout << "Derived2" << endl;
}
};
int main()
{
Base* d1 = new Derived1();
Base* d2 = new Derived2();
vector<Base*> myVec;
myVec.push_back(d1);
myVec.push_back(d2);
for (auto i : myVec) {
i->print();
}
delete d1;
delete d2;
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/473704.html
