Спасибо вам обоим, TC1 и Марку Рэнсому. Я попытался изменить свою проблему, и, наконец, понял, что это лучшее решение, сравнивая его преимущества с его компромиссами, для простой обертки, подобной той, которую я пишу (sqlite3's sqlite3_get_table()
):
enum types {INT, FLOAT, STRING, BLOB, NUL};
class bad_type {};
class data
{
private:
void* pdata;
types type;
public:
data(int dt)
{
int* tmp = new int(dt);
pdata = static_cast<void*>(tmp);
type = INT;
}
// constructors for other types to be added in a similar fashion.
operator int()
{
if (type == INT)
return *(static_cast<int*>(pdata));
throw bad_type();
}
// operators for other types to be added in a similar fashion.
};
Таким образом, я делаю данные * очень подходящим типом указателя для создания гетерогенного контейнера (извините, что я не знал слова, когда задавал вопрос ;-)) в таком случае, когда типы данных ограничены , 5 в этом случае, так как он работает на каком-то низком уровне.
Я просто использовал его в своем тесте main
, как это:
data* array[3];
array[0] = new data(3);
cout << *(array[0]);
И это действительно дает мне 3
, и, безусловно, должна быть возможность применить его и к любому другому типу, особенно на низком уровне в этом случае, когда типы часто являются фундаментальными, а не сложными унаследованными.
Я пришел к выводу, что в таких случаях static_cast
можно терпеть, пожалуйста, поправьте меня, если я ошибаюсь. А также я действительно хочу узнать как ваши критические замечания, так и оценки этого решения, поскольку оно помогает мне учиться как новичку.
Спасибо.