私はtypedef boost::variant<int, float, double, long, bool, std::string, boost::posix_time::ptime> variant
を持っています。これは構造体に異なる型の値を格納するために使用します。特定の型のうちの1つだけが構造体に格納されますが、バリアントから実際の型を取得するために必要なこれらの構造体のベクトルがあります。私はタイプこのバリアントのうち、変換を行う必要があるときは一般的にboost :: variantから<T>に変換します。
は今、私はこれを行う:
variant second = mystruct.variant;
if (second.which() == 5) //string
{
std::string val = boost::get<std::string>(second);
modvalue->AddNodeAttribute(key, val);
}
else if (second.which() == 0) //int
{
int val = boost::get<int>(second);
modvalue->AddNodeAttribute(key, val);
}
else if (second.which() == 2) //double
{
double val = boost::get<double>(second);
modvalue->AddNodeAttribute(key,val);
}
else if (second.which() == 1) //float
{
float val = boost::get<float>(second);
modvalue->AddNodeAttribute(key, val);
}
else if (second.which() == 3) // long
{
long val = boost::get<long>(second);
modvalue->AddNodeAttribute(key, val);
}
else if (second.which() == 4) // bool
{
bool val = boost::get<bool>(second);
modvalue->AddNodeAttribute(key, val);
}
else if (second.which() == 6) // posix::time
{
boost::posix_time::ptime ptm = boost::get<boost::posix_time::ptime>(second);
modvalue->AddNodeAttribute(key, ptm);
}
私は一般的な機能を書くことでこれをやって周りに取得することができ、より一般的な方法があるかどうか、私は疑問に思っていますバリアントと戻り値であるタイプTをとります。しかし、私がそれをするとき、私はまだそれぞれのタイプのTの説明のために同様の文を書く必要があります
FromVariant<int>(var);
のようなものですが、私はまだ私の変種の各タイプのためにそれを行う必要があります。
私の一般的な解決策はコードを減らすことはできませんが、それを増やすことは明らかですが、それは明らかに重要ではありません。誰かが私の変種の中からいろいろな型を取り除くより洗練された解決法を持っているのかどうか、私はちょうど私が元に戻したい型を与える関数を呼び出すことができますか?
ええ、 'static_visitor'はこの正確な問題を解決するためのものです。 :) – jalf
あなたには些細かもしれませんが...私にはありません... –
@Tony、私の答えを変えました - 申し訳ありませんが、私は他のアプローチのコードを出すことができませんでした(それは私のコードベースの仕事です!私はあなたのケースにもっと適していると思います。たとえば、構造体のすべてのフィールドで 'apply_visitor'を呼び出すことができます... – Nim