次のようなコンテナバリアントがあります。
typedef boost::variant<std::vector<int>, std::vector<std::string> > Container;
そして、次のように、ValueContainer オブジェクト (C 構造体) から Container オブジェクトを作成します。
class ContainerAppender: public boost::static_visitor<>
{
public:
void setValueToAppend(const Value* value){
_value = value;
}
void operator()(std::vector<int>& container) const {
container.push_back(_value->value.i);
}
void operator()(std::vector<std::string>& container) const {
container.push_back(_value->value.s);
}
...
private:
const Value* _value;
};
void fillContainer(Container& container, ValueContainer* cContainer) {
if(cContainer) {
ContainerAppender append;
for(int i = 0; i < cContainer->nunberOfValues; i++) {
append.setValueToAppend(&cContainer->values[i]);
boost::apply_visitor(append, container);
}
}
}
C 構造を自由に変更することはできません。
コンテナーの種類が決して変わらないという事実にもかかわらず、ループごとにアクセスしているため、コンテナーにデータを入力するためのソリューションが好きではありません。もっと良い方法があるように感じます。手伝ってくれますか?
Cユニオンは次のとおりです。
typedef struct Value {
union {
int i;
const char* s;
} value;
} Value_T;
typedef struct ValueContainer {
Type type;
unsigned int numberOfValues;
Value *values;
} ValueContainer_T;