Я хочу создать адаптер, который использует функцию подписи void convert(void* input, T* out, int* ok)
, где T перегружен на любой тип, а ok
указывает, произошла ли ошибка (эти функции предоставлены, и я не могу изменить их тело).Фрагмент функциональности внутри шаблона:
template<typename T>
T convert_adapter(void* input){
T result;
int ok = 1;
convert(input, &result, &ok);
if (!ok)
throw Exception("error during conversion");
return result;
}
Это работает достаточно хорошо для типов, таких как int и простые структуры, но не работает на более сложных классах и структур без конструктора по умолчанию, поскольку result
не может быть по умолчаниюинициализируется в первой строке.Дело в том, что если в convert
возникает ошибка, я не использую result
, а если ошибка не возникает, convert
присвоит result
инициализированное значение самостоятельно (*out = {...}
)поэтому мне никогда не нужно инициализировать result
самостоятельно.
Как я могу предоставить convert
указатель на неинициализированные данные соответствующего типа?Я знаю, что, вероятно, мог бы сделать это с char[sizeof(T)]
, но мне интересно, есть ли более элегантное решение.
РЕДАКТИРОВАТЬ: я вижу, что теперь эта проблема противоречит некоторым базовым концепциям C ++Я постараюсь поговорить с провайдером convert
, чтобы найти решение.Я оставлю этот вопрос для потомков.