我想创建一个适用于多种类型的类。
然而,我想要实例化此类的元素,而不是使用类型而是使用字符串(例如,使用"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];
}
};
两次尝试都不编译。我很乐意为我的问题找到一个不那么复杂的解决方案。
编辑:为什么你首先使用字符串而不是类型名?
我有许多使用模板化类的函数。在每个函数中,我可以将模板化类的类型名称知道为字符串,因此我必须使用像这样的调度函数:https://github.com/privefl/bigstatsr/blob/master/src/colstats.cpp。如果你有20个这样的函数,那么为它们中的每一个编写一个调度函数真的很烦人(并且它很容易出错)。
所以我宁愿只为一个类的实例化创建一个调度函数,并在需要这个模板化类的实例的所有函数中使用这个函数。
答案 0 :(得分:5)
您可以执行以下操作:
UPDATE my_table SET my_explanation = execute explain analyze my_table.my_query
答案 1 :(得分:2)
我不会“在字符串上模板”并在返回类型上返回变量而是返回模板。那么你可以
getTab<int>(17);
即便如此,您也不需要在您的问题中提到任何“昂贵的调度员功能”。您只需将Tab
的包装类型设为模板
template < typename T >
void algorithm(Tab<T> const& t) { ... }
为了便于使用和记忆正确,我还用std::vector
替换了裸指针。
#include <vector>
template <typename T>
class Tab {
std::vector<T> tab;
public :
Tab(std::size_t length) : tab(length) {}
T operator[](std::size_t i) {
return tab[i];
}
};
template < typename T >
Tab<T> getTab(std::size_t length)
{
return Tab<T>(length);
}
int main()
{
auto ti = getTab<int>(17);
auto td = getTab<double>(29);
}