多くのタイプで動作するクラスを作成したいと思います。 しかし、このクラスの要素をタイプではなく、文字列でインスタンス化したい(int
の代わりに"int"
を使用するなど)。このクラスを使用する際には、広範なディスパッチャ関数を作成する必要はありません。タイプの代わりに文字列を使用したテンプレート
最初の1:
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;
}
秒1:両方の試みはコンパイルされません
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];
}
};
は小さなクラス
Tab
で、私は2つの "ソリューション" を試してみました。私は私の問題にそれほど複雑ではない解決策を持っているのが大好きです。
編集:なぜ、最初にタイプ名の代わりに文字列を使用していますか?
テンプレート化されたクラスを使用する多くの関数があります。各ファンクションでは、テンプレート化されたクラスのtypenameを文字列として認識できるので、このようなディスパッチ関数を使用する必要があります。https://github.com/privefl/bigstatsr/blob/master/src/colstats.cpp。このような20の関数がある場合、それらのすべての関数に対してディスパッチ関数を書くのは面倒です(エラーが発生しやすい)。
私は、クラスのインスタンス化のためのディスパッチ関数を1つだけ作成し、このテンプレート化されたクラスのインスタンスを必要とするすべての関数でこの関数を使用したいと思います。
「getTab」を関数テンプレートにしてみませんか? – 0x499602D2
@ scohe001編集:コンパイルしないでください。 –
@ 0x499602D2それは私が避けたいものです。私はテンプレートにするが、文字列でしたい。 –