如何將模板類的任何物件傳遞給C 11 中的另一個函式?
在下面的代碼段passInObj中沒有編譯,因為它抱怨Printer&. 我想傳入任何Printer與T我使用的模板無關的內容。
我該怎么做,為什么下面的解決方案不起作用?
#include <iostream>
#include <vector>
template <typename T>
class Printer {
public:
Printer(const T& tl) : t(tl) {}
void print() const {
for (auto x : t) {
std::cout << x << std::endl;
}
}
const T &t;
};
// THIS LINE DOES NOT COMPILE
void passInObj(const Printer& p) {
p.print();
}
int main() {
std::vector<std::string> vec;
vec.push_back("ABC");
Printer<std::vector<std::string>> printer(vec);
printer.print();
passInObj(p);
return 0;
}
uj5u.com熱心網友回復:
我怎樣才能做到這一點
你需要把它做成一個函式模板:
template <class T>
void passInObj(const Printer<T>& p) {
p.print();
}
演示
為什么下面的解決方案不起作用?
因為Printer不是型別,它只是一個模板。為了passInObj使用 any Printer<T>,您需要將該函式變成一個函式模板,以便Printer<T>為用于呼叫它的每個函式實體化它。
uj5u.com熱心網友回復:
雖然默認情況下@TedLyngmo 的答案應該是您的首選,但如果您passInObj()由于某種原因無法制作模板,您也可以通過多型界面來做到這一點。
這是通過添加一個將由所有Printer<>類派生的基介面類來完成的:
#include <iostream>
#include <vector>
class IPrinter {
public:
virtual void print() const = 0;
// Either that or public and virtual
protected:
~IPrinter() = default;
};
template <typename T>
class Printer : public IPrinter {
public:
Printer(const T& tl) : t(tl) {}
void print() const override {
for (auto x : t) {
std::cout << x << std::endl;
}
}
const T &t;
};
void passInObj(const IPrinter& p) {
p.print();
}
int main() {
std::vector<std::string> vec;
vec.push_back("ABC");
Printer<std::vector<std::string>> printer(vec);
printer.print();
passInObj(p);
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/370265.html
下一篇:Java泛型下界
