我想创建一个适配器,它使用函数签名为
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
的提供者交谈,寻找解决方案。我将保留此问题,以备后人参考。
char[sizeof(T)]
而不将 “convert” 更改为初始化而不是赋值,则结果不会很好。 - StoryTeller - Unslander Monicaconvert()
对于不支持默认构造函数的类型有哪些现有用例?例如,如果调用convert(input, &some_foo, int *ok)
,其中some_foo
是类型为Foo
的变量,那么some_foo
如何初始化?有了这些信息,您可能能够指定适当的convert_adapter<Foo>()
特化。如果没有这些信息,任何人都只能猜测。 - PeterPoint
。convert
可以执行以下操作:*out = {3,4};
- bentheiiiconvert
的源代码吗?如果是这样,请发布它。如果不是,您需要阅读文档。如果convert
的作者打算将其与这些类一起使用,则会在文档中提供指南。绝对不可能编写适用于所有类的convert
,因此作者需要选择一些固定的类型convert
能够处理,并在文档中进行描述。 - n. m.