私は、コンストラクタ関連部材内にその引数を格納し、単純な労働組合があります。バリアント関数のテンプレート引数をユニオンベクトルに格納する最も効率的な方法は?
:私は、これらの型の引数をとり、テンプレートの再帰を使用して組合のベクトルに格納する可変引数のコンストラクタを持ってunion Data
{
Data(int i) : _i(i) { }
Data(double d) : _d(d) { }
Data(char c) : _c(c) { }
int _i;
double _d;
char _c;
};
を
template<typename... Ts>
DataStore(Ts... ts)
{
_data.reserve(sizeof...(ts));
store(ts...);
}
template<typename T, typename... Ts>
void store(T t, Ts... ts)
{
_data.push_back(t);
store(ts...);
}
void store()
{
// terminal condition
}
これにより、引数の数に一致する一連のvector::push_back
コールが発生します。
これは、ユニオンベクターに最も効率的に/最も速い方法ですか?
私はこれをより速くするために採用することができる任意のトリック(x86-64/Linuxに固有であり得る)がありますか?
の作業例:
#include <iostream>
#include <vector>
union Data
{
Data(int i) : _i(i) { }
Data(double d) : _d(d) { }
Data(char c) : _c(c) { }
int _i;
double _d;
char _c;
};
struct DataStore
{
template<typename... Ts>
DataStore(Ts... ts)
{
_data.reserve(sizeof...(ts));
store(ts...);
}
template<typename T, typename... Ts>
void store(T t, Ts... ts)
{
_data.push_back(t);
store(ts...);
}
void store()
{
// terminal condition
}
std::vector<Data> _data;
};
int main()
{
DataStore d(1, 2.3, 'c');
std::cout << d._data.size() << '\n'
<< d._data[0]._i << '\n'
<< d._data[1]._d << '\n'
<< d._data[2]._c << '\n';
return 0;
}
emplace_backが役立ちますか?あなたがそこに持っている現在の組合ではないかもしれません。より複雑な型が必要になるでしょう。*私はあなたが技術的に標準化すべきだと考えています。 – Borgleader
@Borgleader私の特定のユースケースでは基本型しか格納しないので、 'std :: forward'は助けにならないでしょうAFAIK –