私はCライブラリによって定義された型で動作するいくつかの関数を持っています。繰り返しテンプレートの特殊化を避けるにはどうすればよいですか?
タイプは、float_2、float_3、float_4、int32_2、int32_3、int32_4です。
これらのタイプには共通のものがあり、sizeという名前のフィールドがあります。 float_2の場合、size = 2、float_3、size = 3など
現在、私はすべての単一タイプに対してテンプレートを特殊化しています。
static void add_number(rapidjson::Value &target, const char* name, float_2 src, Document::AllocatorType& alloc)
{
std::ostringstream ss;
ss << src.x << " " << src.y;
std::string s(ss.str());
target.AddMember(StringRef(name), s, alloc);
}
static void add_number(rapidjson::Value &target, const char* name, float_3 src, Document::AllocatorType& alloc)
{
std::ostringstream ss;
ss << src.x << " " << src.y << " " << src.z;
std::string s(ss.str());
target.AddMember(StringRef(name), s, alloc);
}
必ず次の操作を行うことができるようにいいだろう:
template <typename T>
static void add_number(rapidjson::Value &target, const char* name, T src, Document::AllocatorType& alloc)
{
std::ostringstream ss;
switch(src.size){
case 2: ss << src.x << " " << src.y;
case 3: ss << src.x << " " << src.y << " " << src.z;
case 4: ss << src.x << " " << src.y << " " << src.z << " " << src.w;
}
std::string s(ss.str());
target.AddMember(StringRef(name), s, alloc);
}
しかし、これらのフィールドが定義されたすべてのタイプのために存在していないので、それは動作しません。あらゆる単一のケースを専門にするのを避けることを可能にするC++の魔法のテンプレート構文がありますか?
したがって、各 'float_'は単一を持っていますパラメータは同じ( 'size')ですが、' x'、 'y'、' z'と異なりますか? – Tas
ここでは、専門化を避けることはできません。何か、どこかに特化しなければならない。特殊化をヘルパークラスに委託し、addMember()呼び出しを行うためのadd_number()を残して、ヘルパークラスを 'src'を' std :: string'に変換することもできますが、それはそれです。 C++コンパイラは、コア言語の一部として人工知能を持っていません。そのような人は、一度に1つのステップを実行する必要があるすべてのことを行うためのコードを書く必要があります。それは、特殊なクラスの形式などです。 –
修正。サイズフィールドは、これらのすべてのタイプに共通です。ただし、Tがfloatの場合は例外です。 – Matt