所以如果我有
template <class T>
class Object {
// stuff
};
并且我在要呼叫類 T 的建構式的函式中收到一個物件實體。
void foo(Object object) {
auto newT = object::T();
}
這可能嗎?
uj5u.com熱心網友回復:
不,您可以通過專門化模板來創建類模板的實體。您可以通過將要使用的型別放在尖括號中來做到這一點:
void foo(Object<int> object) {
// auto newobj = Object<int>(); this will work
Object<int> newobj; // but this has less cruft
}
或者
template <class U>
void foo(Object<U> object) {
// auto newobj = Object<U>();
Object<U> newobj {object};
}
請記住,該符號T不存在于模板定義之外。要獲得“真實”,Object您必須輸入實際型別。我選擇了, int但您可能會使用其他東西。
當然,這只有在stuff包含相應的建構式時才有效:
template <class T>
class Object {
// stuff
public:
Object(); // often implicit but sometimes not
Object(Object<T> const &i) = default;
// more stuff
};
uj5u.com熱心網友回復:
通常最好的解決方案是模板內部型別:
template <class T>
void foo(Object<T> object) {
T newT;
}
但是,有時(使用更多元編程)這種解決方案會比替代方案更冗長:
選項1:將模板變數存盤在Object類中:
template <class T>
class Object {
// stuff
public:
using inner_type = T;
};
然后你可以像這樣訪問模板型別:
template <class Obj>
void foo(Obj object) {
typename Obj::inner_type newT;
}
選項 2:創建型別特征(無需添加inner_type到Object):
template <class T>
struct tag {
using type = T;
};
template <class>
struct inner;
template <template <class> class S, class T>
struct inner <S<T>> : tag<T> {};
template <typename T>
using inner_t = typename inner<T>::type;
然后你可以像這樣使用:
template <class Obj>
void foo(Obj object) {
inner_t<Obj> newT;
}
最好概括inner_type采用第一個內部引數,以便它可以處理具有更多引數的模板型別,例如std::vector(第二個引數具有默認值):
template <class>
struct front;
template <template <class, class...> class R, class S, class ... Ts>
struct front <R<S, Ts...>> : tag<S> {};
template <typename T>
using front_t = typename front<T>::type;
演示
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/312592.html
