我希望創建一個與許多類型的作品一類。 然而,我想實例化這個類的一個元素不是一個類型,而是一個字符串(例如使用"int"
代替int
),使我沒有使用這個類時做出廣泛的調度功能。模板用字符串,而不是類型
在一個小班Tab
,我嘗試了兩種 「解決方案」:
第一招:
template <typename T>
class Tab {
public :
Tab(std::size_t length) {
T* tab_[length];
tab = tab_;
}
T* tab;
T operator[](std::size_t i) {
return tab[i];
}
};
Tab getTab(std::string type, std::size_t length) {
if (type == "int") {
Tab<int> tab(length);
} else if (type == "double") {
Tab<double> tab(length);
}
return tab;
}
第二個:
typedef boost::variant<int, double> numeric;
typedef boost::variant<int*, double*> numeric_ptr;
class Tab {
public :
Tab(std::string type, std::size_t length) {
if (type == "int") {
tab = new int[length];
} else if (type == "double") {
tab = new double[length];
}
}
numeric_ptr tab;
numeric operator[](std::size_t i) {
return tab[i];
}
};
兩個嘗試不進行編譯。我很樂意爲我的問題提供一個不那麼複雜的解決方案。
編輯:你爲什麼要使用字符串代替typenames擺在首位?
我有一個用一個模板類的許多功能。在每個函數中,我都可以將模板類的類型名稱作爲字符串來知道,因此我必須使用像這樣的調度函數:https://github.com/privefl/bigstatsr/blob/master/src/colstats.cpp。如果你有20個這樣的函數,爲它們中的每一個寫一個調度函數真的很煩人(並且容易出錯)。
所以我寧願喜歡的類的實例只創建一個調度功能,並在需要這個模板類的一個實例的所有功能,使用該功能。
爲什麼不讓'getTab'成爲函數模板? – 0x499602D2
@ scohe001編輯:不編譯。 –
@ 0x499602D2正是我想避免的。我想模板,但用字符串。 –