C++ 在编译时打印类型未知的数据-我可以不使用开关(名称为\u,类型为\u)进行打印吗?

C++ 在编译时打印类型未知的数据-我可以不使用开关(名称为\u,类型为\u)进行打印吗?,c++,reflection,render-to-string,C++,Reflection,Render To String,假设我需要实现一个具有以下签名的函数: void print_elements(void* buffer, const std::string& element_type_name, size_t len, std::ostream& os); 它应该将缓冲区的len元素打印/流式传输到输出流os。如果我在编译时有这个类型,那么很明显我会 for(const auto& e : buffer) { os << e << " "; } 对于(co

假设我需要实现一个具有以下签名的函数:

void print_elements(void* buffer, const std::string& element_type_name, size_t len, std::ostream& os);
它应该将
缓冲区的
len
元素打印/流式传输到输出流
os
。如果我在编译时有这个类型,那么很明显我会

for(const auto& e : buffer) { os << e << " "; }

对于(const auto&e:buffer){os,最好的解决方案是停止使用非类型指针(例如
void*
)。你可以用模板替换它,或者如果你有一个“数组”,使用例如
std::array
std::vector
(可能与模板结合使用)。@JoachimPileborg:我忘了提到我不控制它。(我可以把数据放在一个向量中,但它仍然是一个任意类型的向量,例如char)。如果你不能更改函数签名,那么你真的无能为力,你必须对
元素类型名称使用set If
If
语句,对指针使用
reinterpret\u cast
语句。你可以将实际的打印循环放在一个单独的模板函数中,从这个
打印元素调用de>函数。@JoachimPileborg:我担心你会这么说。也许有库可以这样做?可能的类型列表是有限的,已知的?
const size_t element_size = size_by_type_name(element_type_name);
for(it = buffer; it < (buffer + len * element_size); it++) {
    auto& stream_op_wrapper = get_stream_op_wrapper_for(os, element_type_name);
    stream_op(os, *it);
}