在结构/类中查找第一个基础基元

Find first underlying primitive in struct/class

本文关键字:第一个 查找 结构      更新时间:2023-10-16

前提:

我有一个可变模板函数,它接受具有同质成员类型的POD(普通的旧数据结构(。

可接受的POD可以完全由4字节整数XOR 4字节浮点组成。

在内部,可变参数被强制到底层类型的指针,并用作基元数组。

问题:

目前,模板功能要求用户提供有关这些POD格式的一些附加信息;例如以下内容:

声明

template<typename ...U>
void foo(const char *format, U... bars);

用法

Blah much, wow; // Underlying type is integral.
Bleh such, params; // underlying type is float.
//... 
foo("iffi",much,params,such,wow);

它有效,但我想绕过格式化字符串。

问题:

有没有一种方法可以在编译时评估底层类型?

编辑:结构的布局及其成员的名称直到编译时才知道。也就是说,库的用户正在提供任意同质POD。

要绕过字符串格式,您可以创建一个特性:

template <typename T /*, typename AlwaysVoidForSFINAE = void*/> struct UnderlyingPodType;
template <> struct UnderlyingPodType<Blah> { using type = int; };
template <> struct UnderlyingPodType<Bleh> { using type = float; };
template<typename ...Ts>
void foo(Ts&&... ts)
{
    using types = std::tuple<UnderlyingPodType<std::decay_t<Ts>>...>;
    // ...
}