在struct / class中查找第一个基础原语

时间:2016-09-09 07:58:55

标签: c++ templates typetraits

前提:

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

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

在内部,variadic参数被强制转换为基础类型的指针,并用作基本数组。

问题:

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

声明

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

用法

test = structure(list(sex1 = c("totalmaleglobal", "totalfemaleglobal", 
                    "totalglobal", "totalfemaleGSK", "totalfemaleglobal", 
                    "totalfemaleUN")), .Names = "sex1", row.names = c(NA, 6L),
                    class="data.frame")

total = grep("total", test[[1]], perl=TRUE, value=TRUE)
totalmale = grep("totalmale", test[[1]], perl=TRUE, value=TRUE)
totalfemale = grep("totalfemale", test[[1]], perl=TRUE, value=TRUE)

print(total)
print(totalmale)
print(totalfemale)

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

问题:

有没有办法在编译时评估基础类型?

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

1 个答案:

答案 0 :(得分:0)

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

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>>...>;
    // ...
}